Split Getdown into multiple (Maven) modules.

- core: the main Getdown logic code
- tools: code to create digest.txt & patch files
- launcher: the standalone launcher/updater app
- ant: the Ant task for creating digest.txt files

This paves the way for a proper Jigsaw-ification of the Getdown code.

I may further factor code out of getdown-launcher and into getdown-core to
enable the use-case where an app embeds Getdown completely and does not use the
launcher app/UI. That will also make it easier to create a JavaFX UI and retire
the old Swing UI.

This also moves the obsolete applet code into a separate applet module, which
is merely a temporary holding area. It will be deleted in the next commit.
This commit is contained in:
Michael Bayne
2018-09-04 09:11:29 -07:00
parent 8ff9bf4d68
commit 4c383f99c7
63 changed files with 386 additions and 264 deletions
+180
View File
@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.threerings</groupId>
<artifactId>getdown</artifactId>
<version>1.7.2-SNAPSHOT</version>
</parent>
<artifactId>getdown-launcher</artifactId>
<packaging>jar</packaging>
<name>Getdown Launcher</name>
<description>The Getdown app updater/launcher</description>
<repositories>
<repository>
<id>lib-repo</id>
<url>file://${basedir}/../lib</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.threerings</groupId>
<artifactId>getdown-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.threerings</groupId>
<artifactId>getdown-tools</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>jregistrykey</groupId>
<artifactId>jregistrykey</artifactId>
<version>1.0</version>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.14</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>proguard</goal></goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>6.0.3</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<configuration>
<proguardVersion>6.0.3</proguardVersion>
<outputDirectory>${project.build.directory}</outputDirectory>
<outjar>${project.build.finalName}.jar</outjar>
<injar>${project.build.finalName}.jar</injar>
<assembly>
<inclusions>
<inclusion>
<groupId>com.threerings</groupId>
<artifactId>getdown-core</artifactId>
</inclusion>
<inclusion>
<groupId>com.threerings</groupId>
<artifactId>getdown-tools</artifactId>
</inclusion>
<inclusion>
<groupId>com.samskivert</groupId>
<artifactId>samskivert</artifactId>
<filter>
!**/*.java,
!**/swing/RuntimeAdjust*,
!**/swing/util/ButtonUtil*,
!**/util/CalendarUtil*,
!**/util/Calendars*,
!**/util/Log4JLogger*,
!**/util/PrefsConfig*,
!**/util/SignalUtil*,
com/samskivert/Log.class,
**/samskivert/io/**,
**/samskivert/swing/**,
**/samskivert/text/**,
**/samskivert/util/**
</filter>
</inclusion>
<inclusion>
<groupId>jregistrykey</groupId>
<artifactId>jregistrykey</artifactId>
</inclusion>
</inclusions>
</assembly>
<obfuscate>true</obfuscate>
<options>
<option>-keep public class com.threerings.getdown.** { *; }</option>
<option>-keep public class ca.beq.util.win32.registry.** { *; }</option>
<option>-keepattributes Exceptions, InnerClasses, Signature</option>
</options>
<libs>
<lib>${rt.jar.path}</lib>
</libs>
<addMavenDescriptor>false</addMavenDescriptor>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.threerings.getdown.launcher.GetdownApp</mainClass>
</manifest>
<manifestEntries>
<Permissions>all-permissions</Permissions>
<Application-Name>Getdown</Application-Name>
<Codebase>*</Codebase>
<Application-Library-Allowable-Codebase>*</Application-Library-Allowable-Codebase>
<Caller-Allowable-Codebase>*</Caller-Allowable-Codebase>
<Trusted-Library>true</Trusted-Library>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<!-- finagling to find rt.jar -->
<profile>
<id>non-mac-jre</id>
<activation>
<file><exists>${java.home}/../lib/rt.jar</exists></file>
</activation>
<properties>
<rt.jar.path>${java.home}/../lib/rt.jar</rt.jar.path>
</properties>
</profile>
<profile>
<id>non-mac-jdk</id>
<activation>
<file><exists>${java.home}/lib/rt.jar</exists></file>
</activation>
<properties>
<rt.jar.path>${java.home}/lib/rt.jar</rt.jar.path>
</properties>
</profile>
<profile>
<id>java-9-jdk</id>
<activation>
<file><exists>${java.home}/jmods/java.base.jmod</exists></file>
</activation>
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<configuration>
<libs>
<lib>${java.home}/jmods/java.base.jmod</lib>
<lib>${java.home}/jmods/java.desktop.jmod</lib>
<lib>${java.home}/jmods/java.logging.jmod</lib>
<lib>${java.home}/jmods/jdk.jsobject.jmod</lib>
</libs>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
@@ -0,0 +1,100 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.samskivert.swing.GroupLayout;
import com.samskivert.swing.Spacer;
import com.samskivert.swing.VGroupLayout;
import com.samskivert.text.MessageUtil;
import static com.threerings.getdown.Log.log;
/**
* Displays a confirmation that the user wants to abort installation.
*/
public class AbortPanel extends JFrame
implements ActionListener
{
public AbortPanel (Getdown getdown, ResourceBundle msgs)
{
_getdown = getdown;
_msgs = msgs;
setLayout(new VGroupLayout());
setResizable(false);
setTitle(get("m.abort_title"));
JLabel message = new JLabel(get("m.abort_confirm"));
message.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
add(message);
add(new Spacer(5, 5));
JPanel row = GroupLayout.makeButtonBox(GroupLayout.CENTER);
JButton button;
row.add(button = new JButton(get("m.abort_ok")));
button.setActionCommand("ok");
button.addActionListener(this);
row.add(button = new JButton(get("m.abort_cancel")));
button.setActionCommand("cancel");
button.addActionListener(this);
getRootPane().setDefaultButton(button);
add(row);
}
// documentation inherited
@Override
public Dimension getPreferredSize ()
{
// this is annoyingly hardcoded, but we can't just force the width
// or the JLabel will claim a bogus height thinking it can lay its
// text out all on one line which will booch the whole UI's
// preferred size
return new Dimension(300, 200);
}
// documentation inherited from interface
public void actionPerformed (ActionEvent e)
{
String cmd = e.getActionCommand();
if (cmd.equals("ok")) {
System.exit(0);
} else {
setVisible(false);
}
}
/** Used to look up localized messages. */
protected String get (String key)
{
// if this string is tainted, we don't translate it, instead we
// simply remove the taint character and return it to the caller
if (MessageUtil.isTainted(key)) {
return MessageUtil.untaint(key);
}
try {
return _msgs.getString(key);
} catch (MissingResourceException mre) {
log.warning("Missing translation message '" + key + "'.");
return key;
}
}
protected Getdown _getdown;
protected ResourceBundle _msgs;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,260 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.awt.EventQueue;
import java.awt.Color;
import java.awt.Container;
import java.awt.IllegalComponentStateException;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import com.samskivert.swing.util.SwingUtil;
import com.samskivert.util.ArrayUtil;
import com.samskivert.util.RunAnywhere;
import com.samskivert.util.StringUtil;
import com.threerings.getdown.data.Digest;
import com.threerings.getdown.data.SysProps;
import static com.threerings.getdown.Log.log;
/**
* The main application entry point for Getdown.
*/
public class GetdownApp
{
public static void main (String[] argv)
{
try {
start(argv);
} catch (Exception e) {
log.warning("main() failed.", e);
}
}
/**
* Runs Getdown as an application, using the arguments supplie as {@code argv}.
* @return the {@code Getdown} instance that is running. {@link Getdown#start} will have been
* called on it.
* @throws Exception if anything goes wrong starting Getdown.
*/
public static Getdown start (String[] argv) throws Exception {
int aidx = 0;
List<String> args = Arrays.asList(argv);
// check for app dir in a sysprop and then via argv
String adarg = SysProps.appDir();
if (StringUtil.isBlank(adarg)) {
if (args.isEmpty()) {
System.err.println("Usage: java -jar getdown.jar app_dir [app_id] [app args]");
System.exit(-1);
}
adarg = args.get(aidx++);
}
// check for an app identifier in a sysprop and then via argv
String appId = SysProps.appId();
if (StringUtil.isBlank(appId) && aidx < args.size()) {
appId = args.get(aidx++);
}
// pass along anything after that as app args
String[] appArgs = (aidx >= args.size()) ? null :
args.subList(aidx, args.size()).toArray(ArrayUtil.EMPTY_STRING);
// ensure a valid directory was supplied
File appDir = new File(adarg);
if (!appDir.exists() || !appDir.isDirectory()) {
log.warning("Invalid app_dir '" + adarg + "'.");
System.exit(-1);
}
// load X.509 certificate if it exists
File crtFile = new File(appDir, Digest.digestFile(Digest.VERSION) + ".crt");
List<Certificate> crts = new ArrayList<>();
if (crtFile.exists()) {
try (FileInputStream fis = new FileInputStream(crtFile)) {
X509Certificate certificate = (X509Certificate)
CertificateFactory.getInstance("X.509").generateCertificate(fis);
crts.add(certificate);
} catch (Exception e) {
log.warning("Certificate error: " + e.getMessage());
System.exit(-1);
}
}
// pipe our output into a file in the application directory
if (!SysProps.noLogRedir()) {
File logFile = new File(appDir, "launcher.log");
try {
PrintStream logOut = new PrintStream(
new BufferedOutputStream(new FileOutputStream(logFile)), true);
System.setOut(logOut);
System.setErr(logOut);
} catch (IOException ioe) {
log.warning("Unable to redirect output to '" + logFile + "': " + ioe);
}
}
// record a few things for posterity
log.info("------------------ VM Info ------------------");
log.info("-- OS Name: " + System.getProperty("os.name"));
log.info("-- OS Arch: " + System.getProperty("os.arch"));
log.info("-- OS Vers: " + System.getProperty("os.version"));
log.info("-- Java Vers: " + System.getProperty("java.version"));
log.info("-- Java Home: " + System.getProperty("java.home"));
log.info("-- User Name: " + System.getProperty("user.name"));
log.info("-- User Home: " + System.getProperty("user.home"));
log.info("-- Cur dir: " + System.getProperty("user.dir"));
log.info("---------------------------------------------");
Getdown app = new Getdown(appDir, appId, crts, null, appArgs) {
@Override
protected Container createContainer () {
// create our user interface, and display it
String title = StringUtil.isBlank(_ifc.name) ? "" : _ifc.name;
if (_frame == null) {
_frame = new JFrame(title);
_frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing (WindowEvent evt) {
handleWindowClose();
}
});
_frame.setUndecorated(_ifc.hideDecorations);
try {
_frame.setBackground(_ifc.background);
} catch (UnsupportedOperationException e) {
log.warning("Failed to set background", e);
} catch (IllegalComponentStateException e) {
log.warning("Failed to set background", e);
}
_frame.setResizable(false);
} else {
_frame.setTitle(title);
_frame.getContentPane().removeAll();
}
if (_ifc.iconImages != null) {
ArrayList<Image> icons = new ArrayList<>();
for (String path : _ifc.iconImages) {
Image img = loadImage(path);
if (img == null) {
log.warning("Error loading icon image", "path", path);
} else {
icons.add(img);
}
}
if (icons.isEmpty()) {
log.warning("Failed to load any icons", "iconImages", _ifc.iconImages);
} else {
_frame.setIconImages(icons);
}
}
_frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
return _frame.getContentPane();
}
@Override
protected void showContainer () {
if (_frame != null) {
_frame.pack();
SwingUtil.centerWindow(_frame);
_frame.setVisible(true);
}
}
@Override
protected void disposeContainer () {
if (_frame != null) {
_frame.dispose();
_frame = null;
}
}
@Override
protected void showDocument (String url) {
String[] cmdarray;
if (RunAnywhere.isWindows()) {
String osName = System.getProperty("os.name", "");
if (osName.indexOf("9") != -1 || osName.indexOf("Me") != -1) {
cmdarray = new String[] {
"command.com", "/c", "start", "\"" + url + "\"" };
} else {
cmdarray = new String[] {
"cmd.exe", "/c", "start", "\"\"", "\"" + url + "\"" };
}
} else if (RunAnywhere.isMacOS()) {
cmdarray = new String[] { "open", url };
} else { // Linux, Solaris, etc.
cmdarray = new String[] { "firefox", url };
}
try {
Runtime.getRuntime().exec(cmdarray);
} catch (Exception e) {
log.warning("Failed to open browser.", "cmdarray", cmdarray, e);
}
}
@Override
protected void exit (int exitCode) {
// if we're running the app in the same JVM, don't call System.exit, but do
// make double sure that the download window is closed.
if (invokeDirect()) {
disposeContainer();
} else {
System.exit(exitCode);
}
}
@Override
protected void fail (String message) {
super.fail(message);
// super.fail causes the UI to be created (if needed) on the next UI tick, so we
// want to wait until that happens before we attempt to redecorate the window
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// if the frame was set to be undecorated, make window decoration available
// to allow the user to close the window
if (_frame != null && _frame.isUndecorated()) {
_frame.dispose();
Color bg = _frame.getBackground();
if (bg != null && bg.getAlpha() < 255) {
// decorated windows do not allow alpha backgrounds
_frame.setBackground(
new Color(bg.getRed(), bg.getGreen(), bg.getBlue()));
}
_frame.setUndecorated(false);
showContainer();
}
}
});
}
protected JFrame _frame;
};
app.start();
return app;
}
}
@@ -0,0 +1,18 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.awt.Image;
/**
* Abstracts away the process of loading an image so that it can be done differently in the app and
* applet.
*/
public interface ImageLoader
{
/** Loads and returns the image with the supplied path. */
public Image loadImage (String path);
}
@@ -0,0 +1,20 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.io.IOException;
/**
* Thrown when it's detected that multiple instances of the same getdown installer are running.
*/
public class MultipleGetdownRunning extends IOException
{
public MultipleGetdownRunning ()
{
super("m.another_getdown_running");
}
}
@@ -0,0 +1,144 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import com.samskivert.swing.GroupLayout;
import com.samskivert.swing.Spacer;
import com.samskivert.swing.VGroupLayout;
import com.samskivert.text.MessageUtil;
import static com.threerings.getdown.Log.log;
/**
* Displays an interface with which the user can configure their proxy
* settings.
*/
public class ProxyPanel extends JPanel
implements ActionListener
{
public ProxyPanel (Getdown getdown, ResourceBundle msgs)
{
_getdown = getdown;
_msgs = msgs;
setLayout(new VGroupLayout());
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
add(new JLabel(get("m.configure_proxy")));
add(new Spacer(5, 5));
JPanel row = new JPanel(new BorderLayout(5, 5));
row.add(new JLabel(get("m.proxy_host")), BorderLayout.WEST);
row.add(_host = new SaneTextField());
add(row);
row = new JPanel(new BorderLayout(5, 5));
row.add(new JLabel(get("m.proxy_port")), BorderLayout.WEST);
row.add(_port = new SaneTextField());
add(row);
add(new Spacer(5, 5));
add(new JLabel(get("m.proxy_extra")));
row = GroupLayout.makeButtonBox(GroupLayout.CENTER);
JButton button;
row.add(button = new JButton(get("m.proxy_ok")));
button.setActionCommand("ok");
button.addActionListener(this);
row.add(button = new JButton(get("m.proxy_cancel")));
button.setActionCommand("cancel");
button.addActionListener(this);
add(row);
// set up any existing proxy defaults
String host = System.getProperty("http.proxyHost");
if (host != null) {
_host.setText(host);
}
String port = System.getProperty("http.proxyPort");
if (port != null) {
_port.setText(port);
}
}
// documentation inherited
@Override
public void addNotify ()
{
super.addNotify();
_host.requestFocusInWindow();
}
// documentation inherited
@Override
public Dimension getPreferredSize ()
{
// this is annoyingly hardcoded, but we can't just force the width
// or the JLabel will claim a bogus height thinking it can lay its
// text out all on one line which will booch the whole UI's
// preferred size
return new Dimension(500, 350);
}
// documentation inherited from interface
public void actionPerformed (ActionEvent e)
{
String cmd = e.getActionCommand();
if (cmd.equals("ok")) {
// communicate this info back to getdown
_getdown.configureProxy(_host.getText(), _port.getText());
} else {
// they canceled, we're outta here
System.exit(0);
}
}
/** Used to look up localized messages. */
protected String get (String key)
{
// if this string is tainted, we don't translate it, instead we
// simply remove the taint character and return it to the caller
if (MessageUtil.isTainted(key)) {
return MessageUtil.untaint(key);
}
try {
return _msgs.getString(key);
} catch (MissingResourceException mre) {
log.warning("Missing translation message '" + key + "'.");
return key;
}
}
protected static class SaneTextField extends JTextField
{
@Override
public Dimension getPreferredSize () {
Dimension d = super.getPreferredSize();
d.width = Math.max(d.width, 150);
return d;
}
}
protected Getdown _getdown;
protected ResourceBundle _msgs;
protected JTextField _host;
protected JTextField _port;
}
@@ -0,0 +1,127 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.awt.Image;
import static com.threerings.getdown.Log.log;
public class RotatingBackgrounds
{
/**
* Creates a placeholder if there are no images. Just returns null from getImage every time.
*/
public RotatingBackgrounds ()
{
makeEmpty();
}
/** Creates a single image background. */
public RotatingBackgrounds (Image background)
{
percentages = new int[] { 0 };
minDisplayTime = new int[] { 0 };
images = new Image[] { background };
errorImage = images[0];
}
/**
* Create a sequence of images to be rotated through from <code>backgrounds</code>.
*
* Each String in backgrounds should be the path to the image, a semicolon, and the minimum
* amount of time to display the image in seconds. Each image will be active for an equal
* percentage of the download process, unless one hasn't been active for its minimum display
* time when the next should be shown. In that case, it's left up until its been there for its
* minimum display time and then the next one gets to come up.
*/
public RotatingBackgrounds (String[] backgrounds, String errorBackground, ImageLoader loader)
{
percentages = new int[backgrounds.length];
minDisplayTime = new int[backgrounds.length];
images = new Image[backgrounds.length];
for (int ii = 0; ii < backgrounds.length; ii++) {
String[] pieces = backgrounds[ii].split(";");
if (pieces.length != 2) {
log.warning("Unable to parse background image '" + backgrounds[ii] + "'");
makeEmpty();
return;
}
images[ii] = loader.loadImage(pieces[0]);
try {
minDisplayTime[ii] = Integer.parseInt(pieces[1]);
} catch (NumberFormatException e) {
log.warning("Unable to parse background image display time '" +
backgrounds[ii] + "'");
makeEmpty();
return;
}
percentages[ii] = (int)((ii/(float)backgrounds.length) * 100);
}
if (errorBackground == null) {
errorImage = images[0];
} else {
errorImage = loader.loadImage(errorBackground);
}
}
/**
* @return the image to display at the given progress or null if there aren't any.
*/
public Image getImage (int progress)
{
if (images.length == 0) {
return null;
}
long now = System.currentTimeMillis();
if (current != images.length - 1
&& (current == -1 || (progress >= percentages[current + 1] &&
(now - currentDisplayStart) / 1000 > minDisplayTime[current]))) {
current++;
currentDisplayStart = now;
}
return images[current];
}
/**
* Returns the image to display if an error has caused getdown to fail.
*/
public Image getErrorImage ()
{
return errorImage;
}
/**
* @return the number of images in this RotatingBackgrounds
*/
public int getNumImages() {
return images.length;
}
protected void makeEmpty ()
{
percentages = new int[] {};
minDisplayTime = new int[] {};
images = new Image[] {};
}
/** Time at which the currently displayed image was first displayed in millis. */
protected long currentDisplayStart;
/** The index of the currently displayed image or -1 if we haven't displayed any. */
protected int current = -1;
protected Image[] images;
/** The image to display if getdown has failed due to an error. */
protected Image errorImage;
/** Percentage at which each image should be displayed. */
protected int[] percentages;
/** Time to show each image in seconds. */
protected int[] minDisplayTime;
}
@@ -0,0 +1,396 @@
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2016 Getdown authors
// https://github.com/threerings/getdown/blob/master/LICENSE
package com.threerings.getdown.launcher;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageObserver;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.swing.JComponent;
import javax.swing.Timer;
import com.samskivert.swing.Label;
import com.samskivert.swing.LabelStyleConstants;
import com.samskivert.swing.util.SwingUtil;
import com.samskivert.text.MessageUtil;
import com.samskivert.util.StringUtil;
import com.samskivert.util.Throttle;
import com.threerings.getdown.data.Application.UpdateInterface;
import static com.threerings.getdown.Log.log;
/**
* Displays download and patching status.
*/
public class StatusPanel extends JComponent
implements ImageObserver
{
public StatusPanel (ResourceBundle msgs)
{
_msgs = msgs;
// Add a bit of "throbbing" to the display by updating the number of dots displayed after
// our status. This lets users know things are still working.
_timer = new Timer(1000,
new ActionListener() {
public void actionPerformed (ActionEvent event) {
if (_status != null && !_displayError) {
_statusDots = (_statusDots % 3) + 1; // 1, 2, 3, 1, 2, 3, etc.
updateStatusLabel();
}
}
});
}
public void init (UpdateInterface ifc, RotatingBackgrounds bg, Image barimg)
{
_ifc = ifc;
_bg = bg;
Image img = _bg.getImage(_progress);
int width = img == null ? -1 : img.getWidth(this);
int height = img == null ? -1 : img.getHeight(this);
if (width == -1 || height == -1) {
Rectangle bounds = ifc.progress.union(ifc.status);
// assume the x inset defines the frame padding; add it on the left, right, and bottom
_psize = new Dimension(bounds.x + bounds.width + bounds.x,
bounds.y + bounds.height + bounds.x);
} else {
_psize = new Dimension(width, height);
}
_barimg = barimg;
invalidate();
}
@Override
public boolean imageUpdate (Image img, int infoflags, int x, int y, int width, int height)
{
boolean updated = false;
if ((infoflags & WIDTH) != 0) {
_psize.width = width;
updated = true;
}
if ((infoflags & HEIGHT) != 0) {
_psize.height = height;
updated = true;
}
if (updated) {
invalidate();
setSize(_psize);
getParent().setSize(_psize);
}
return (infoflags & ALLBITS) == 0;
}
/**
* Adjusts the progress display to the specified percentage.
*/
public void setProgress (int percent, long remaining)
{
boolean needsRepaint = false;
// maybe update the progress label
if (_progress != percent) {
_progress = percent;
if (!_ifc.hideProgressText) {
String msg = MessageFormat.format(get("m.complete"), percent);
_newplab = createLabel(msg, _ifc.progressText);
}
needsRepaint = true;
}
// maybe update the remaining label
if (remaining > 1) {
// skip this estimate if it's been less than a second since our last one came in
if (!_rthrottle.throttleOp()) {
_remain[_ridx++%_remain.length] = remaining;
}
// smooth the remaining time by taking the trailing average of the last four values
remaining = 0;
int values = Math.min(_ridx, _remain.length);
for (int ii = 0; ii < values; ii++) {
remaining += _remain[ii];
}
remaining /= values;
if (!_ifc.hideProgressText) {
// now compute our display value
int minutes = (int)(remaining / 60), seconds = (int)(remaining % 60);
String remstr = minutes + ":" + ((seconds < 10) ? "0" : "") + seconds;
String msg = MessageFormat.format(get("m.remain"), remstr);
_newrlab = createLabel(msg, _ifc.statusText);
}
needsRepaint = true;
} else if (_rlabel != null || _newrlab != null) {
_rthrottle = new Throttle(1, 1000);
_ridx = 0;
_newrlab = _rlabel = null;
needsRepaint = true;
}
if (needsRepaint) {
repaint();
}
}
/**
* Displays the specified status string.
*/
public void setStatus (String status, boolean displayError)
{
_status = xlate(status);
_displayError = displayError;
updateStatusLabel();
}
/**
* Stop the throbbing.
*/
public void stopThrob ()
{
_timer.stop();
_statusDots = 3;
updateStatusLabel();
}
@Override
public void addNotify ()
{
super.addNotify();
_timer.start();
}
@Override
public void removeNotify ()
{
_timer.stop();
super.removeNotify();
}
// documentation inherited
@Override
public void paintComponent (Graphics g)
{
super.paintComponent(g);
Graphics2D gfx = (Graphics2D)g;
// attempt to draw a background image...
Image img;
if (_displayError) {
img = _bg.getErrorImage();
} else {
img = _bg.getImage(_progress);
}
if (img != null) {
gfx.drawImage(img, 0, 0, this);
}
Object oalias = SwingUtil.activateAntiAliasing(gfx);
// if we have new labels; lay them out
if (_newlab != null) {
_newlab.layout(gfx);
_label = _newlab;
_newlab = null;
}
if (_newplab != null) {
_newplab.layout(gfx);
_plabel = _newplab;
_newplab = null;
}
if (_newrlab != null) {
_newrlab.layout(gfx);
_rlabel = _newrlab;
_newrlab = null;
}
if (_barimg != null) {
gfx.setClip(_ifc.progress.x, _ifc.progress.y,
_progress * _ifc.progress.width / 100,
_ifc.progress.height);
gfx.drawImage(_barimg, _ifc.progress.x, _ifc.progress.y, null);
gfx.setClip(null);
} else {
gfx.setColor(_ifc.progressBar);
gfx.fillRect(_ifc.progress.x, _ifc.progress.y,
_progress * _ifc.progress.width / 100,
_ifc.progress.height);
}
if (_plabel != null) {
int xmarg = (_ifc.progress.width - _plabel.getSize().width)/2;
int ymarg = (_ifc.progress.height - _plabel.getSize().height)/2;
_plabel.render(gfx, _ifc.progress.x + xmarg, _ifc.progress.y + ymarg);
}
if (_label != null) {
_label.render(gfx, _ifc.status.x, getStatusY(_label));
}
if (_rlabel != null) {
// put the remaining label at the end of the status area. This could be dangerous
// but I think the only time we would display it is with small statuses.
int x = _ifc.status.x + _ifc.status.width - _rlabel.getSize().width;
_rlabel.render(gfx, x, getStatusY(_rlabel));
}
SwingUtil.restoreAntiAliasing(gfx, oalias);
}
// documentation inherited
@Override
public Dimension getPreferredSize ()
{
return _psize;
}
/**
* Update the status label.
*/
protected void updateStatusLabel ()
{
String status = _status;
if (!_displayError) {
for (int ii = 0; ii < _statusDots; ii++) {
status += " .";
}
}
_newlab = createLabel(status, _ifc.statusText);
// set the width of the label to the width specified
int width = _ifc.status.width;
if (width == 0) {
// unless we had trouble reading that width, in which case use the entire window
width = getWidth();
}
// but the window itself might not be initialized and have a width of 0
if (width > 0) {
_newlab.setTargetWidth(width);
}
repaint();
}
/**
* Get the y coordinate of a label in the status area.
*/
protected int getStatusY (Label label)
{
// if the status region is higher than the progress region, we
// want to align the label with the bottom of its region
// rather than the top
if (_ifc.status.y > _ifc.progress.y) {
return _ifc.status.y;
}
return _ifc.status.y + (_ifc.status.height - label.getSize().height);
}
/**
* Create a label, taking care of adding the shadow if needed.
*/
protected Label createLabel (String text, Color color)
{
Label label = new Label(text, color, FONT);
if (_ifc.textShadow != null) {
label.setAlternateColor(_ifc.textShadow);
label.setStyle(LabelStyleConstants.SHADOW);
}
return label;
}
/** Used by {@link #setStatus}. */
protected String xlate (String compoundKey)
{
// to be more efficient about creating unnecessary objects, we
// do some checking before splitting
int tidx = compoundKey.indexOf('|');
if (tidx == -1) {
return get(compoundKey);
} else {
String key = compoundKey.substring(0, tidx);
String argstr = compoundKey.substring(tidx+1);
String[] args = StringUtil.split(argstr, "|");
// unescape and translate the arguments
for (int i = 0; i < args.length; i++) {
// if the argument is tainted, do no further translation
// (it might contain |s or other fun stuff)
if (MessageUtil.isTainted(args[i])) {
args[i] = MessageUtil.unescape(MessageUtil.untaint(args[i]));
} else {
args[i] = xlate(MessageUtil.unescape(args[i]));
}
}
return get(key, args);
}
}
/** Used by {@link #setStatus}. */
protected String get (String key, Object[] args)
{
String msg = get(key);
return (msg != null) ?
MessageFormat.format(MessageUtil.escape(msg), args)
: (key + StringUtil.toString(args));
}
/** Used by {@link #setStatus}, and {@link #setProgress}. */
protected String get (String key)
{
// if we have no _msgs that means we're probably recovering from a
// failure to load the translation messages in the first place, so
// just give them their key back because it's probably an english
// string; whee!
if (_msgs == null) {
return key;
}
// if this string is tainted, we don't translate it, instead we
// simply remove the taint character and return it to the caller
if (MessageUtil.isTainted(key)) {
return MessageUtil.untaint(key);
}
try {
return _msgs.getString(key);
} catch (MissingResourceException mre) {
log.warning("Missing translation message '" + key + "'.");
return key;
}
}
protected Image _barimg;
protected RotatingBackgrounds _bg;
protected Dimension _psize;
protected ResourceBundle _msgs;
protected int _progress = -1;
protected String _status;
protected int _statusDots = 1;
protected boolean _displayError;
protected Label _label, _newlab;
protected Label _plabel, _newplab;
protected Label _rlabel, _newrlab;
protected UpdateInterface _ifc;
protected Timer _timer;
protected long[] _remain = new long[4];
protected int _ridx;
protected Throttle _rthrottle = new Throttle(1, 1000L);
protected static final Font FONT = new Font("SansSerif", Font.BOLD, 12);
}
@@ -0,0 +1,111 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = Abort installation?
m.abort_confirm = <html>Are you sure you want to stop installation? \
You can resume at a later time by running the application again.</html>
m.abort_ok = Quit
m.abort_cancel = Continue installation
m.detecting_proxy = Trying to auto-detect proxy settings
m.configure_proxy = <html>We were unable to connect to our servers to download data. \
<ul><li> If Windows Firewall or Norton Internet Security was instructed \
to block <code>javaw.exe</code> we cannot download the data. You will need \
to allow <code>javaw.exe</code> to access the internet. You can try \
running the app again, but you may need to clear javaw.exe from your \
firewall configuration ( Start -> Control Panel -> Windows Firewall ).</ul> \
<p> Your computer may access the Internet through a proxy and we were \
unable to automatically detect your proxy settings. If you know your \
proxy settings, you can enter them below.</html>
m.proxy_extra = <html>If you are sure that you don't use a proxy then \
perhaps there is a temporary Internet outage that is preventing us from \
communicating with the servers. In this case, you can cancel and try \
installing again later.</html>
m.proxy_host = Proxy IP
m.proxy_port = Proxy port
m.proxy_ok = OK
m.proxy_cancel = Cancel
m.downloading_java = Downloading Java Virtual Machine
m.unpacking_java = Unpacking Java Virtual Machine
m.resolving = Resolving downloads
m.downloading = Downloading data
m.failure = Download failed: {0}
m.checking = Checking for update
m.validating = Validating
m.patching = Patching
m.launching = Launching
m.patch_notes = Patch Notes
m.play_again = Play Again
m.complete = {0}% complete
m.remain = {0} remaining
m.updating_metadata = Downloading control files
m.init_failed = Our configuration file is missing or corrupt. Attempting \
to download a new copy...
m.java_download_failed = We were unable to automatically download the \
necessary version of Java for your computer.\n\n\
Please go to www.java.com and download the latest version of \
Java, then try running the application again.
m.java_unpack_failed = We were unable to unpack an updated version of \
Java. Please make sure you have at least 100 MB of free space on your \
harddrive and try running the application again.\n\n\
If that does not solve the problem, go to www.java.com and download and \
install the latest version of Java and try again.
m.unable_to_repair = We were unable to download the necessary files after \
five attempts. You can try running the application again, but if it \
fails you may need to uninstall and reinstall.
m.unknown_error = The application has failed to launch due to some strange \
error from which we could not recover. Please visit\n{0} for information on \
how to recover.
m.init_error = The application has failed to launch due to the following \
error:\n{0}\n\nPlease visit\n{1} for \
information on how to handle such problems.
m.readonly_error = The directory in which this application is installed: \
\n{0}\nis read-only. Please install the application into a directory where \
you have write access.
m.missing_resource = The application has failed to launch due to a missing \
resource:\n{0}\n\nPlease visit\n{1} for information on how to handle such \
problems.
m.insufficient_permissions_error = You did not accept this application's \
digital signature. If you want to run the application, you will need to accept \
its digital signature.\n\nTo do so, you will need to quit your web browser, \
restart it, and return to this web page to relaunch the application. When the \
security dialog is shown, click the button to accept the digital signature \
and grant this application the privileges it needs to run.
m.corrupt_digest_signature_error = We couldn't verify the application's digital \
signature.\nPlease check that you are launching the application from\nthe \
correct website.
m.default_install_error = the support section of the website
m.another_getdown_running = Multiple instances of this application's \
installer are running. This one will stop and let another complete.
m.applet_stopped = Getdown's applet was told to stop working.
# application/digest errors
m.missing_appbase = The configuration file is missing the 'appbase'.
m.invalid_version = The configuration file specifies an invalid version.
m.invalid_appbase = The configuration file specifies an invalid 'appbase'.
m.missing_class = The configuration file is missing the application class.
m.missing_code = The configuration file specifies no code resources.
m.invalid_digest_file = The digest file is invalid.
@@ -0,0 +1,122 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = Installation abbrechen?
m.abort_confirm = <html>Bist du sicher, dass du die Installation abbrechen \
m\u00f6chtest? \
Du kannst sp\u00e4ter fortfahren, indem du die Anwendung erneut \
ausf\u00fchrst.</html>
m.abort_ok = Beenden
m.abort_cancel = Installation fortsetzen
m.detecting_proxy = Versuche Proxy-Einstellungen automatisch zu ermitteln
m.configure_proxy = <html>Es war nicht m\u00f6glich, eine Verbindung zu unserem \
Server herzustellen, um die Anwendungsdaten herunterzuladen. \
<ul><li> Falls Windows Firewall oder Norton Internet Security angewiesen \
wurden, <code>javaw.exe</code> zu blockieren, kann die Anwendung nicht \
heruntergeladen werden. Du musst <code>javaw.exe</code> erlauben, \
Verbindung zum Internet herzustellen. Du kannst nochmals versuchen, die \
Anwendung zu starten, aber eventuell musst du javaw.exe aus der \
Firewall-Konfiguration entfernen (Start -> Systemsteuerung -> Windows \
Firewall). </ul> \
<p> Eventuell ist der Computer durch einen Proxy mit dem Internet \
verbunden. Es war uns nicht m\u00f6glich, die Proxy-Einstellungen automatisch \
zu ermitteln. Falls bekannt, k\u00f6nnen diese unten eingetragen \
werden.</html>
m.proxy_extra = <html>Falls kein Proxy verwendet wird, liegt \
m\u00f6glicherweise eine St\u00f6rung in der Internetverbindung zu unserem Server \
vor. In diesem Fall bitte abbrechen und sp\u00e4ter noch einmal \
versuchen.</html>
m.proxy_host = Proxy IP
m.proxy_port = Proxy port
m.proxy_ok = OK
m.proxy_cancel = Abbrechen
m.downloading_java = Lade Java Virtual Machine herunter
m.unpacking_java = Entpacke Java Virtual Machine
m.resolving = Bereite Download vor
m.downloading = Lade Daten herunter
m.failure = Download fehlgeschlagen: {0}
m.checking = Suche nach Updates
m.validating = Validiere Download
m.patching = Patche
m.launching = Starte
m.patch_notes = Patchnotes
m.complete = {0}% abgeschlossen
m.remain = {0} \u00fcbrig
m.updating_metadata = Lade Steuerungsdateien herunter
m.init_failed = Unsere Konfigurationsdatei fehlt oder ist besch\u00e4digt. \
Versuche, eine neue Kopie herunterzuladen...
m.java_download_failed = Wir konnten die notwendige Javaversion f\u00fcr deinen \
Computer nicht automatisch herunterladen. \n\n \
Bitte auf www.java.com die aktuelle Javaversion herunterladen und dann die \
Anwendung erneut starten.
m.java_unpack_failed = Wir konnten die aktualisierte Javaversion nicht \
entpacken. Bitte stelle sicher, dass wenigstens 100MB Platz auf der \
Festplatte frei sind und versuche dann die Anwendung erneut zu \
starten.\n\n\ \
Falls das das Problem nicht beseitigt, bitte auf www.java.com die aktuelle \
Javaversion herunterladen und installieren und dann erneut versuchen.
m.unable_to_repair = Wir konnten die notwendigen Dateien nach 5 Versuchen \
nicht herunterladen. Du kannst versuchen, die Anwendung erneut zu starten, \
aber wenn dies erneut fehlschl\u00e4gt, musst du die Anwendung deinstallieren \
und erneut installieren.
m.unknown_error = Die Anwendung konnte wegen eines unbekannten Fehlers \
nicht gestartet werden. Bitte auf \n{0} weiterlesen.
m.init_error = Die Anwendung konnte wegen folgendem Fehler nicht gestartet \
werden:\n{0}\n\n Bitte auf \n{1} weiterlesen, um zu erfahren, wie bei \
solchen Problemen vorzugehen ist.
m.readonly_error = Das Verzeichnis, in dem die Anwendung installiert ist: \
\n{0}\nist nicht schreibberechtigt. Bitte in ein Verzeichnis mit \
Schreibzugriff installieren.
m.missing_resource = Die Anwendung konnte nicht gestartet werden, da die \
folgende Quelle nicht gefunden wurde:\n{0}\n\n\ Bitte auf \n{1} \
weiterlesen, um zu erfahren, wie bei solchen Problemen vorzugehen ist.
m.insufficient_permissions_error = Du hast die digitale Signatur dieser \
Anwendung nicht akzeptiert. Falls du diese Anwendung benutzen willst, \
musst du ihre digitale Signatur akzeptieren. \n\Um das zu tun, musst du \
deinen Browser beenden, neu starten und erneut die Anwendung von dieser \
Webseite aus starten. Wenn die Sicherheitsabfrage erscheint, bitte die \
digitale Signatur akzeptieren, um der Anwendung die n\u00f6tigen Rechte zu \
geben, die sie braucht, um zu laufen.
m.corrupt_digest_signature_error = Wir konnten die digitale Signatur \
dieser Anwendung nicht \u00fcberpr\u00fcfen.\nBitte \u00fcberpr\u00fcfe, ob du die Anwendung \
von der richtigen Webseite aus startest.
m.default_install_error = der Support-Webseite
m.another_getdown_running = Diese Installationsanwendung l\u00e4uft in mehreren \
Instanzen. Diese Instanz wird sich beenden und eine andere Instanz den \
Vorgang erledigen lassen.
m.applet_stopped = Die Anwendung wurde beendet.
# application/digest errors
m.missing_appbase = In der Konfigurationsdatei fehlt die 'appbase'.
m.invalid_version = In der Konfigurationsdatei steht die falsche Version.
m.invalid_appbase = In der Konfigurationsdatei steht die falsche 'appbase'.
m.missing_class = In der Konfigurationsdatei fehlt die Anwendungsklasse.
m.missing_code = Die Konfigurationsdatei enth\u00e4lt keine Codequellen.
m.invalid_digest_file = Die Hashwertedatei ist ung\u00fcltig.
@@ -0,0 +1,112 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = \u00bfCancelar la instalaci\u00f3n?
m.abort_confirm = <html>\u00bfEst\u00e1s seguro de querer cancelar la instalaci\u00f3n? \
Puedes continuarla despu\u00e9s si corres de nuevo la aplicaci\u00f3n.</html>
m.abort_ok = Cancelar
m.abort_cancel = Continuar la instalaci\u00f3n
m.detecting_proxy = Detectando autom\u00e1ticamente la configuraci\u00f3n proxy
m.configure_proxy = <html>No ha sido posible conectar con nuestros servidores para \
descargar los datos del juego. \
<ul><li> Si el cortafuegos de Windows o Norton Internet Security tiene instrucciones \
de bloquear <code>javaw.exe</code> no podemos descargar el juego. Necesitar\u00e1s \
permitir que <code>javaw.exe</code> tenga acceso al Internet. Puedes intentar \
correr el juego de nuevo, pero es posible que debas dar permisos a javaw.exe en la \
configuraci\u00f3n de tu cortafuegos ( Inicio -> Panel de control -> Firewall de Windows ).</ul> \
<p> Es posible que tu computadora tenga acceso al Internet por medio de un proxy por lo que \
no ha sido posible detectar autom\u00e1ticamente tu configuraci\u00f3n. Si conoces tu \
configuraci\u00f3n proxy, puedes anotarla abajo.</html>
m.proxy_extra = <html>Si est\u00e1s seguro de que no tienes un proxy entonces \
tal vez exista un falla temporal en el Internet que est\u00e1 evitando que podamos \
comunicarnos con los servidores. En este caso, puedes cancelar e intentar \
instalarla de nuevo m\u00e1s tarde.</html>
m.proxy_host = IP proxy
m.proxy_port = Puerto proxy
m.proxy_ok = OK
m.proxy_cancel = Cancelar
m.downloading_java = Descargando Java Virtual Machine
m.unpacking_java = Desempacando Java Virtual Machine
m.resolving = Resolviendo descarga
m.downloading = Descargando datos
m.failure = Descarga fallida: {0}
m.checking = Buscando actualizaciones
m.validating = Validando
m.patching = Parchando
m.launching = Lanzando
m.patch_notes = Notas del parche
m.complete = {0}% completado
m.remain = {0} restante
m.updating_metadata = Descargando los archivos de control
m.init_failed = Un archivo de configuraci\u00f3n est\u00e1 faltante o est\u00e1 corrupto. Intentando \
descargar una nueva copia...
m.java_download_failed = No ha sido posible descargar autom\u00e1ticamente la \
versi\u00f3n de Java necesaria para tu computadora.\n\n\
Por favor ve a www.java.com y descarga la \u00faltima versi\u00f3n de \
Java, despu\u00e9s intenta correr de nuevo la aplicaci\u00f3n.
m.java_unpack_failed = No ha sido posible desempacar una versi\u00f3n actualizada de \
Java. Por favor aseg\u00farate de tener al menos 100 MB de espacio libre en tu \
disco duro e intenta correr de nuevo la aplicaci\u00f3n.\n\n\
Si eso no soluciona el problema, ve a www.java.com y descarga e \
instala la \u00faltima versi\u00f3n de Java e intenta de nuevo.
m.unable_to_repair = No ha sido posible descargar los archivos necesarios despu\u00e9s de \
cinco intentos. Puedes intentar correr de nuevo la aplicaci\u00f3n, pero si falla \
de nuevo podr\u00edas necesitar desinstalar y reinstalar.
m.unknown_error = La aplicaci\u00f3n no ha podido iniciar debido a un extra\u00f1o \
error del que no se pudo recobrar. Por favor visita\n{0} para ver informaci\u00f3n acerca \
de como recuperarla.
m.init_error = La aplicaci\u00f3n no ha podido iniciar debido al siguiente \
error:\n{0}\n\nPor favor visita\n{1} para \
ver informaci\u00f3n acerca de como manejar ese tipo de problemas.
m.readonly_error = El directorio en el que esta aplicaci\u00f3n est\u00e1 instalada: \
\n{0}\nes solo lectura. Por favor instala la aplicaci\u00f3n en un directorio en el cual \
tengas acceso de escritura.
m.missing_resource = La aplicaci\u00f3n no ha podido iniciar debido a un recurso \
faltante:\n{0}\n\nPor favor visita\n{1} para informaci\u00f3n acerca de como solucionar \
estos problemas.
m.insufficient_permissions_error = No aceptaste la firma digital de \
esta aplicaci\u00f3n. Si quieres correr la aplicaci\u00f3n, necesitas aceptar \
su firma digital.\n\nPara hacerlo, necesitas cerrar tu navegador, \
reiniciarlo, y regresar a esta p\u00e1gina web para reiniciar la aplicaci\u00f3n. Cuando se muestre \
el di\u00e1logo de seguridad, haz clic en el bot\u00f3n para aceptar la firmar digital \
y otorgar a esta aplicaci\u00f3n los privilegios que necesita para correr.
m.corrupt_digest_signature_error = No pudimos verificar la firma digital \
de la aplicaci\u00f3n.\nPor favor revisa que est\u00e9s lanzando la aplicaci\u00f3n desde\nel \
sitio web correcto.
m.default_install_error = la secci\u00f3n de asistencia de este sitio web
m.another_getdown_running = Est\u00e1n corriendo m\u00faltiples instancias de \
este instalador. Este se detendr\u00e1 para permitir que otra contin\u00fae.
m.applet_stopped = Se le dijo al applet de Getdown que dejara de trabajar.
# application/digest errors
m.missing_appbase = Al archivo de configuraci\u00f3n le falta el 'appbase'.
m.invalid_version = El archivo de configuraci\u00f3n especifica una versi\u00f3n no v\u00e1lida.
m.invalid_appbase = El archivo de configuraci\u00f3n especifica un 'appbase' no v\u00e1lido.
m.missing_class = Al archivo de configuraci\u00f3n le falta la clase de aplicaci\u00f3n.
m.missing_code = El archivo de configuraci\u00f3n especifica que no hay recursos de c\u00f3digo.
m.invalid_digest_file = El archivo digest no es v\u00e1lido.
@@ -0,0 +1,108 @@
#
# $Id: messages.properties 485 2012-03-08 22:05:30Z ray.j.greenwell $
#
# Getdown translation messages
m.abort_title = Annuler l'installation?
m.abort_confirm =<html>\u00cates-vous s\u00fbr de vouloir annuler l'installation? \
Vous pourrez reprendre l'installation en ex\u00e9cutant l'application de nouveau.</html>
m.abort_ok = Quitter
m.abort_cancel = Continuer l'installation
m.detecting_proxy = D\u00e9tection automatique des r\u00e9glages proxy
m.configure_proxy =<html>Connexion au serveur impossible. \
<ul><li> Veuillez v\u00e9rifier que <code>javaw.exe</code> n'est bloqu\u00e9 \
par aucun pare-feu ou antivirus. \
Vous pouvez vous rendre sur la configuration du pare-feu windows via \
(D\u00e9marrer -> Panneau de Configuration -> Pare-feu Windows ).</ul> \
<p> Il est \u00e9galement possible que vous soyez derri\u00e8re un proxy que l'application \
est incapable de d\u00e9tecter automatiquement. \
Si tel est le cas, veuillez saisir les r\u00e9glages proxy ci-dessous.</html>
m.proxy_extra =<html>Si vous \u00eates certain de ne pas utiliser de proxy, il est \
possible qu'une interruption temporaire de la connexion internet emp\u00fbche la \
communication avec les serveurs. Dans ce cas, vous pouvez relancer \
l'installation ult\u00e9rieurement.</html>
m.proxy_host = Proxy IP
m.proxy_port = Proxy port
m.proxy_ok = OK
m.proxy_cancel = Annuler
m.downloading_java = T\u00e9l\u00e9chargement en cours de la Machine Virtuelle Java
m.unpacking_java = D\u00e9compression en cours de la Machine Virtuelle Java
m.resolving = R\u00e9solution des t\u00e9l\u00e9chargements en cours
m.downloading = T\u00e9l\u00e9chargement des donn\u00e9es en cours
m.failure = \u00c9chec du t\u00e9l\u00e9chargement: {0}
m.checking = V\u00e9rification de la mise-\u00e0-jour en cours
m.validating = Validation en cours
m.patching = Modification en cours
m.launching = Lancement en cours
m.patch_notes = Notes de mise-\u00e0-jour
m.complete = Complet \u00e0 {0}%
m.remain = {0} restant
m.updating_metadata = T\u00e9l\u00e9chargement des fichiers de contr\u00f4les en cours
m.init_failed = Notre fichier de configuration est perdu ou corrompu. T\u00e9l\u00e9chargement \
d'une nouvelle copie en cours ...
m.java_download_failed = Impossible de t\u00e9l\u00e9charger automatiquement la \
version de Java n\u00e9cessaire.\n\n\
Veuillez vous rendre sur www.java.com et t\u00e9l\u00e9charger et installer la version \
la plus r\u00e9cente de Java, avant d'ex\u00e9cuter l'application \u00e0 nouveau.
m.java_unpack_failed = Impossible de d\u00e9compresser la version de \
Java n\u00e9cessaire. Veuillez v\u00e9rifier que vous avez au moins 100 MB d'espace libre \
sur votre disque dur puis tenter d'ex\u00e9cuter l'application \u00e0 nouveau.\n\n\
Si le probl\u00e8me persiste, rendez vous www.java.com et t\u00e9l\u00e9chargez et \
installez la version plus r\u00e9cente de Java puis essayez de nouveau.
m.unable_to_repair = Impossible de t\u00e9l\u00e9charger les fichiers n\u00e9cessaires apr\u00e8s \
cinq tentatives. Vous pouvez tenter d'ex\u00e9cuter l'application \u00e0 nouveau, mais il est \
possible qu'une d\u00e9sinstallation / r\u00e9installation soit n\u00e9cessaire.
m.unknown_error = Une erreur inconnue a fait \u00e9chouer le lancement de l'application. \
Veuillez visiter\n{0} pour plus d'informations.
m.init_error = Le lancement de l'application a \u00e9chou\u00e9 \u00e0 cause de l'erreur \
suivante:\n{0}\n\nVeuillez visiter\n{1} pour plus d'informations.
m.readonly_error = Le r\u00e9pertoire d'installation de cette application: \
\n{0}\nest en lecture seule. Veuillez installer l'application dans un r\u00e9pertoire avec \
un acc\u00e8s en \u00e9criture.
m.missing_resource = Le lancement de l'application a \u00e9chou\u00e9 \u00e0 cause d'une \
ressource manquante:\n{0}\n\nVeuillez visiter\n{1} pour plus d'informations.
m.insufficient_permissions_error = Vous n'avez pas accepter la signature \
num\u00e9rique de cette application. Si vous souhaitez ex\u00e9cuter cette application, vous \
devez accepter sa signature num\u00e9rique.\n\nAfin de le faire, vous devez quitter votre \
navigateur, le red\u00e9marrer, retourner \u00e0 cette page puis relancer l'application. \
Une fois la bo\u00eete de dialogue de s\u00e9curit\u00e9 affich\u00e9e, cliquez sur le bouton \
pour accepter la signature num\u00e9rique et accorder les permissions n\u00e9cessaires au bon \
fonctionnement de l'application.
m.corrupt_digest_signature_error = Nous ne pouvons pas v\u00e9rifier la signature num\u00e9rique \
de l'application.\nVeuillez v\u00e9rifier que vous lancez l'application \ndepuis \
la bonne adresse internet.
m.default_install_error = la section de support du site
m.another_getdown_running = Plusieurs instances d'installation de cette \
application sont d\u00e9j\u00e0 en cours d'ex\u00e9cution. Cette instance va s'arr\u00eater \
afin de permettre aux autres d'aboutir.
m.applet_stopped = L'appelet Getdown a \u00e9t\u00e9 stopp\u00e9e.
# application/digest errors
m.missing_appbase = Le fichier de configuration ne contient pas 'appbase'.
m.invalid_version = Le fichier de configuration sp\u00e9cifie une version invalide.
m.invalid_appbase = Le fichier de configuration sp\u00e9cifie un 'appbase' invalide.
m.missing_class = Le fichier de configuration ne contient pas la classe de l'application.
m.missing_code = Le fichier de configuration ne sp\u00e9cifie aucune ressource de code.
m.invalid_digest_file = Le fichier digest est invalide.
@@ -0,0 +1,111 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = Annullare l'installazione?
m.abort_confirm = <html>Sei sicuro di voler annullare l'installazione? \
Potrai riprenderla in seguito, riavviando nuovamente l'applicazione.</html>
m.abort_ok = Chiudi
m.abort_cancel = Continua l'installazione
m.detecting_proxy = Provo a recuperare le configurazioni del proxy
m.configure_proxy = <html>Impossibile collegarsi al server per \
recuperare i dati. \
<ul><li> Se il Firewall di Windows o Norton Internet Security bloccano \
<code>javaw.exe</code> non si possono scaricare i dati. Devi \
permettere a <code>javaw.exe</code> di accedere a internet. Puoi provare \
di nuovo, ma dovresti abilitare javaw.exe nella tua configurazione \
del firewall ( Start -> Pannello di Controllo -> Windows Firewall ).</ul> \
<p> Il tuo computer potrebbe accedere a internet attraverso un proxy e \
questo potrebbe non essere stato riconosciuto automaticamente. Se conosci le \
tue impostazioni del proxy, puoi inserirle di seguito.</html>
m.proxy_extra = <html>Se sei sicuro di non usare proxy \
potrebbe essere un problema di internet o di collegamento con il server. \
In questo caso puoi annullare e ripetere l'installazione più tardi.</html>
m.proxy_host = IP Proxy
m.proxy_port = Porta Proxy
m.proxy_ok = OK
m.proxy_cancel = Annulla
m.downloading_java = Scaricando la Java Virtual Machine
m.unpacking_java = Scompattando la Java Virtual Machine
m.resolving = Recuperando i file da scaricare
m.downloading = Download dei dati
m.failure = Download fallito: {0}
m.checking = Sto controllando gli aggiornamenti
m.validating = Validazione
m.patching = Applico le patch
m.launching = Avvio
m.patch_notes = Note delle Patch
m.play_again = Avvia Nuovamente
m.complete = {0}% completato
m.remain = {0} rimasto
m.updating_metadata = Scarico i file di controllo
m.init_failed = La configurazione è corrotta o mancante. Provo a \
scaricarne una nuova copia...
m.java_download_failed = Impossibile scaricare la versione corretta \
di Java per il tuo computer.\n\n\
Visita www.java.com e scarica l'ultima versione di \
Java, poi lancia di nuovo l'applicazione.
m.java_unpack_failed = Impossibile scompattare l'aggiornamento di \
Java. Verifica di avere almeno 100 MB di spazio libero nel tuo \
hard disk e prova a rilanciare l'applicazione.\n\n\
Se l'errore persiste, vistia www.java.com, scarica e \
installa l'ultima versione di Java e riprova.
m.unable_to_repair = Impossibile scaricare i file necessari dopo 5 \
tentativi. Puoi provare a rilanciare l'applicazione, ma se fallisce \
di nuovo potresti dover reinstallarla.
m.unknown_error = L'applicazione non è stata avviata a causa di uno strano \
errore che non conosco. Visita\n{0} per avere informazioni \
in merito.
m.init_error = L'applicazione non è stata avviata a causa del seguente \
errore:\n{0}\n\nVistita\n{1} per avere \
informazioni su come risolvere il problema.
m.readonly_error = La directory dove l'applicazione è installata: \
\n{0}\nè in sola lettura. Installa l'applicazione dove hai i diritti \
di scrittura.
m.missing_resource = L'applicazione non è stata avviata a causa di mancanza \
di risorse:\n{0}\n\nVisita\n{1} per avere informazioni su come risolvere \
questi problemi.
m.insufficient_permissions_error = Non hai accettato la \
firma digitale. Se vuoi eseguire l'applicazione devi accettare la \
firma digitale.\n\nPer farlo, riavvia il tuo browser \
e ritorna in questa pagina per rilanciare l'applicazione. Quando l'avviso \
di sicurezza viene mostrato, clicca per accettare la firma digitale \
ed eseguire l'applicazione con i privilegi necessari.
m.corrupt_digest_signature_error = Impossibile verificare la firma digitale dell'applicazione \
.\nControlla di aver lanciato l'applicazione dal\n\
sito web corretto.
m.default_install_error = la sezione di supporto del sito
m.another_getdown_running = E' già in esecuzione un'istanza del programma. \
Questa verrà chiusa.
m.applet_stopped = L'applet di Getdown è stata interrotta.
# application/digest errors
m.missing_appbase = Il tag "appbase" è mancante.
m.invalid_version = Il file di configurazione non contiene una versione valida (tag "version").
m.invalid_appbase = Il tag "appbase" non è valido.
m.missing_class = Il file di configurazione non contiene la classe da eseguire (tag "class").
m.missing_code = Il file di configurazione non contiene alcuna risorsa (tag "code").
m.invalid_digest_file = Il file di digest non è valido.
@@ -0,0 +1,104 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u4e2d\u6b62\u3057\u307e\u3059\u304b\uff1f
m.abort_confirm = <html>\u672c\u5f53\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u4e2d\u6b62\u3057\u307e\u3059\u304b\uff1f \
\u5f8c\u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8d77\u52d5\u3057\u305f\u969b\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u518d\u958b\u3067\u304d\u307e\u3059\u3002</html>
m.abort_ok = \u4e2d\u6b62
m.abort_cancel = \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306e\u7d9a\u884c
m.detecting_proxy = \u81ea\u52d5\u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\u5b9f\u884c\u4e2d
m.configure_proxy = <html>\u30b5\u30fc\u30d0\u306b\u63a5\u7d9a\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u30b2\u30fc\u30e0\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306b \
\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \
<ul><li>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u307e\u305f\u306f\u30ce\u30fc\u30c8\u30f3\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u304c \
<code>javaw.exe</code>\u3092\u30d6\u30ed\u30c3\u30af\u3059\u308b\u3088\u3046\u8a2d\u5b9a\u3057\u3066\u3042\u308b\u5834\u5408\u306f\u3001\u30b2\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3002 \u8a2d\u5b9a\u3092 \
<code>javaw.exe</code>\u7d4c\u7531\u3067\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \u30b2\u30fc\u30e0\u3092\u518d\u8d77\u52d5 \
\u3057\u305f\u5f8c\u3001\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u306e\u8a2d\u5b9a\u304b\u3089javaw.exe \u3092\u524a\u9664 \
\u3057\u3066\u304f\u3060\u3055\u3044\uff08\u30b9\u30bf\u30fc\u30c8\u2192\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d1\u30cd\u30eb\u2192\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\uff09\u3002</ul> \
<p>\u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\u306e\u81ea\u52d5\u691c\u51fa\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u304a\u4f7f\u3044\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306f \
\u30d7\u30ed\u30ad\u30b7\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3078\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3044\u307e\u3059\u3002 \u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\u306e\u8a73\u7d30\u304c \
\u308f\u304b\u3063\u3066\u3044\u308b\u5834\u5408\u306f\u3001\u4e0b\u306b\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002</html>
m.proxy_extra = <html>\u30d7\u30ed\u30ad\u30b7\u3092\u4f7f\u7528\u3057\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u3001\u4e00\u6642\u7684\u306a \
\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306e\u4e0d\u5177\u5408\u306b\u3088\u308a\u3001\u30b5\u30fc\u30d0\u3068\u4ea4\u4fe1\u3067\u304d\u306a\u3044\u72b6\u614b\u306b\u3042\u308b \
\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u305d\u306e\u5834\u5408\u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u3001 \
\u5f8c\u307b\u3069\u6539\u3081\u3066\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002</html>
m.proxy_host = \u30d7\u30ed\u30ad\u30b7IP
m.proxy_port = \u30d7\u30ed\u30ad\u30b7\u30dd\u30fc\u30c8
m.proxy_ok = OK
m.proxy_cancel = \u30ad\u30e3\u30f3\u30bb\u30eb
m.downloading_java = Java\u30d0\u30fc\u30c1\u30e3\u30eb\u30de\u30b7\u30f3\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u4e2d
m.unpacking_java = Java\u30d0\u30fc\u30c1\u30e3\u30eb\u30de\u30b7\u30f3\u306e\u89e3\u51cd\u4e2d
m.resolving = \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u8a2d\u5b9a\u4e2d
m.downloading = \u30c7\u30fc\u30bf\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u4e2d
m.failure = \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u5931\u6557\uff1a {0}
m.checking = \u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306e\u78ba\u8a8d\u4e2d
m.validating = \u8a8d\u8a3c\u4e2d
m.patching = \u4fee\u6b63\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u4e2d
m.launching = \u5b9f\u884c\u4e2d
m.complete = {0}\uff05\u5b8c\u4e86
m.remain = \u3000\u6b8b\u308a{0}
m.updating_metadata = \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d5\u30a1\u30a4\u30eb\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u4e2d
m.init_failed = \u74b0\u5883\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u306a\u3044\u304b\u3001\u307e\u305f\u306f\u58ca\u308c\u3066\u3044\u307e\u3059\u3002 \u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u3092 \
\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u4e2d\u2026
m.java_download_failed = \u304a\u4f7f\u3044\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306b\u3001Java\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u6700\u65b0 \
\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u81ea\u52d5\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n\n \
www.java.com \u304b\u3089\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u624b\u52d5\u3067\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3001 \
\u518d\u5ea6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.java_unpack_failed = Java\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u89e3\u51cd \
\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30cf\u30fc\u30c9\u30c9\u30e9\u30a4\u30d6\u306e\u30e1\u30e2\u30ea\u304c100MB\u4ee5\u4e0a\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089 \
\u518d\u5ea6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n \
\u554f\u984c\u304c\u89e3\u6c7a\u3057\u306a\u3044\u5834\u5408\u306f\u3001www.java.com \u304b\u3089Java\u306e\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u3092 \
\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u304b\u3089\u3001\u518d\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002
m.unable_to_repair = 5\u56de\u8a66\u884c\u3057\u307e\u3057\u305f\u304c\u3001\u5fc5\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 \
\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u5f8c\u307b\u3069\u6539\u3081\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \
\u518d\u5ea6\u5931\u6557\u3057\u305f\u5834\u5408\u306f\u3001\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5f8c\u306b\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.unknown_error = \u539f\u56e0\u4e0d\u660e\u306e\u30a8\u30e9\u30fc\u306b\u3088\u308a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c \
\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u89e3\u6c7a\u65b9\u6cd5\u3092\n{0}\u3067 \
\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.init_error = \u6b21\u306e\u30a8\u30e9\u30fc\u306b\u3088\u308a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093 \
\u3067\u3057\u305f\u3002\n{0}\n\n\u5bfe\u51e6\u65b9\u6cd5\u3092\n{1}\u3067 \
\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.readonly_error = \u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d5\u30a9\u30eb\u30c0\u306f \
\n{0}\n\u8aad\u307f\u53d6\u308a\u5c02\u7528\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u66f8\u304d\u8fbc\u307f\u304c\u3067\u304d\u308b\u30d5\u30a9\u30eb\u30c0\u306b \
\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.missing_resource = \u30ea\u30bd\u30fc\u30b9\u4e0d\u660e\u306e\u305f\u3081\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093 \
\u3067\u3057\u305f\u3002\n{0}\n\n\u5bfe\u51e6\u65b9\u6cd5\u3092\n{1}\u3067\u78ba\u8a8d \
\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.insufficient_permissions_error = \u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30b8\u30bf\u30eb\u7f72\u540d\u304c\u62d2\u5426 \
\u3055\u308c\u307e\u3057\u305f\u3002 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u5834\u5408\u306f\u3001\u30c7\u30b8\u30bf\u30eb\u7f72\u540d\u306e\u627f\u8a8d\u304c \
\u5fc5\u8981\u3067\u3059\u3002\n\n\u627f\u8a8d\u306b\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u3092\u9589\u3058\u3066\u304b\u3089\u518d\u5ea6\u958b\u304d\u3001 \
\u672c\u30db\u30fc\u30e0\u30da\u30fc\u30b8\u3092\u518d\u8868\u793a\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u518d\u5ea6\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044 \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e \
\u8b66\u544a\u304c\u8868\u793a\u3055\u308c\u305f\u6642\u306f\u3001\u5b9f\u884c\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30c7\u30b8\u30bf\u30eb\u7f72\u540d\u3092\u627f\u8a8d\u3057\u3001 \
\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.corrupt_digest_signature_error = \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30b8\u30bf\u30eb\u7f72\u540d\u304c\u8a8d\u8a3c \
\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n\u6307\u5b9a\u30db\u30fc\u30e0\u30da\u30fc\u30b8\u304b\u3089\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u304b\n \
\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
m.default_install_error = \u30db\u30fc\u30e0\u30da\u30fc\u30b8\u3067\u306e\u30b5\u30dd\u30fc\u30c8\u8868\u793a
# application/digest errors
m.missing_appbase = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306eappbase\u304c\u4e0d\u660e\u3067\u3059\u3002
m.invalid_version = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306f\u7121\u52b9\u306a\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002
m.invalid_appbase = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u304c\u7121\u52b9\u306aappbase\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002
m.missing_class = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u304c\u4e0d\u660e\u3067\u3059\u3002
m.missing_code = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u30b3\u30fc\u30c9\u30ea\u30bd\u30fc\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
m.invalid_digest_file = \u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u304c\u7121\u52b9\u3067\u3059\u3002
@@ -0,0 +1,99 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = \uC124\uCE58\uB97C \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
m.abort_confirm = <html>\uC815\uB9D0\uB85C \uC124\uCE58\uB97C \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C? \
\uB098\uC911\uC5D0 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC2E4\uD589\uD558\uC5EC \uC124\uCE58\uB97C \uC7AC\uAC1C\uD558\uC5EC \uC8FC\uC2ED\uC2DC\uC624.</html>
m.abort_ok = \uC911\uC9C0
m.abort_cancel = \uACC4\uC18D\uD558\uC5EC \uC124\uCE58
m.detecting_proxy = \uC790\uB3D9 \uD504\uB85D\uC2DC\uB97C \uC124\uC815\uC744 \uC2DC\uB3C4
m.configure_proxy = <html>\uAC8C\uC784 \uB370\uC774\uD130\uB97C \uBC1B\uAE30 \uC704\uD55C \uC11C\uBC84 \uC811\uC18D\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4.\
<ul><li>\uC708\uB3C4\uC6B0 \uBC29\uD654\uBCBD \uB610\uB294 \uB178\uD134 \uC778\uD130\uB137 \uC2DC\uD050\uB9AC\uD2F0\uAC00 <code>javaw.exe</code>\uC774 \uC124\uC815\uC5D0\uC11C \uCC28\uB2E8\uB418\uC5B4 \uC788\uC744 \uACBD\uC6B0, \
\uAC8C\uC784 \uB370\uC774\uD130\uB97C \uB2E4\uC6B4\uB85C\uB4DC \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \
<code>javaw.exe</code>\uAC00 \uC778\uD130\uB137 \uC5F0\uACB0\uC744 \uD560 \uC218 \uC788\uB3C4\uB85D \uC124\uC815\uC744 \uBCC0\uACBD\uD558\uC5EC \uC8FC\uC2ED\uC2DC\uC624. \
\uAC8C\uC784\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD55C \uD6C4, \uBC29\uD654\uBCBD \uC124\uC815\uC5D0\uC11C javaw.exe\uB97C \uC0AD\uC81C\uD558\uC5EC \uC8FC\uC2ED\uC2DC\uC624. \
( \uC2DC\uC791 -> \uC81C\uC5B4\uD310 -> \uC708\uB3C4\uC6B0 \uBC29\uD654\uBCBD )</ul> \
<p> \uCEF4\uD4E8\uD130\uAC00 \uD504\uB85D\uC2DC \uC11C\uBC84\uB97C \uD1B5\uD574 \uC778\uD130\uB137\uC5D0 \uC5F0\uACB0\uB418\uC5B4 \uC788\uB2E4\uBA74, \uD504\uB85D\uC2DC \uC124\uC815\uC758 \uC790\uB3D9 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC73C\uBBC0\uB85C, \
\uC0AC\uC6A9\uD558\uB294 \uD504\uB85D\uC2DC \uC124\uC815\uC744 \uC54C\uACE0 \uC788\uC744 \uACBD\uC6B0 \uC544\uB798\uC5D0 \uC785\uB825\uD558\uC5EC \uC8FC\uC2DC\uAE38 \uBC14\uB78D\uB2C8\uB2E4.</html>
m.proxy_extra = \uC790\uB3D9 \uD504\uB85D\uC2DC\uB97C \uC124\uC815\uC744 \uC2DC\uB3C4
m.proxy_host = \uD504\uB85D\uC2DC IP
m.proxy_port = \uD504\uB85D\uC2DC \uD3EC\uD2B8
m.proxy_ok = OK
m.proxy_cancel = \uCDE8\uC18C
m.downloading_java = \uC790\uBC14 \uAC00\uC0C1 \uBA38\uC2E0(JVM) \uB2E4\uC6B4\uB85C\uB4DC \uC911
m.unpacking_java = \uC790\uBC14 \uAC00\uC0C1 \uBA38\uC2E0(JVM) \uC555\uCD95\uC744 \uD574\uC81C\uD558\uB294 \uC911
m.resolving = \uB2E4\uC6B4\uB85C\uB4DC \uBD84\uC11D \uC911
m.downloading = \uB370\uC774\uD130 \uB2E4\uC6B4\uB85C\uB4DC \uC911
m.failure = \uB2E4\uC6B4\uB85C\uB4DC \uC2E4\uD328: {0}
m.checking = \uC5C5\uB370\uC774\uD2B8 \uCCB4\uD06C
m.validating = \uC720\uD6A8\uC131 \uAC80\uC0AC \uC911
m.patching = \uD328\uCE58 \uC911
m.launching = \uC2E4\uD589 \uC911
m.patch_notes = \uD328\uCE58 \uB178\uD2B8
m.play_again = \uB2E4\uC2DC \uC2E4\uD589
m.complete = {0}% \uC644\uB8CC
m.remain = {0} \uB0A8\uC74C
m.updating_metadata = \uCEE8\uD2B8\uB864 \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uC911
m.init_failed = \uC124\uC815 \uD30C\uC77C\uC774 \uB204\uB77D\uB418\uC5C8\uAC70\uB098 \uBCC0\uD615\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \
\uC0C8\uB85C\uC6B4 \uBCF5\uC0AC\uBCF8\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uC911\uC785\uB2C8\uB2E4...
m.java_download_failed = \uC774 \uCEF4\uD4E8\uD130\uC5D0 \uD544\uC694\uD55C \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC758 \uC790\uBC14\uB97C \uC790\uB3D9\uC73C\uB85C \uB2E4\uC6B4\uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n\n\
\uC790\uBC14 \uC6F9\uC0AC\uC774\uD2B8(www.java.com)\uB85C \uAC00\uC11C \uCD5C\uC2E0\uC758 \uC790\uBC14\uB97C \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uC73C\uC2E0 \uD6C4, \
\uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC2ED\uC2DC\uC624.
m.java_unpack_failed = \uC5C5\uB370\uC774\uD2B8\uB41C \uBC84\uC804\uC758 \uC790\uBC14\uC758 \uC555\uCD95\uC744 \uD480 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \
\uD558\uB4DC\uB4DC\uB77C\uC774\uBE0C\uC5D0 \uCD5C\uC18C\uD55C 100MB\uC758 \uC6A9\uB7C9\uC744 \uD655\uBCF4\uD55C \uC774\uD6C4, \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC2ED\uC2DC\uC624.\n\n\
\uB9CC\uC57D \uBB38\uC81C\uAC00 \uD574\uACB0\uB418\uC9C0 \uC54A\uB294\uB2E4\uBA74, \uC790\uBC14 \uC6F9\uC0AC\uC774\uD2B8(www.java.com)\uB85C \uAC00\uC11C \uCD5C\uC2E0\uC758 \uC790\uBC14\uB97C \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uC73C\uC2E0 \uD6C4, \
\uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC2ED\uC2DC\uC624.
m.unable_to_repair = \uB2E4\uC12F\uBC88\uC758 \uC2DC\uB3C4\uC5D0\uB3C4 \uD544\uC694\uD55C \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \
\uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uB2E4\uC2DC \uC2DC\uC791\uD574\uBCF4\uC2DC\uACE0, \uADF8\uB798\uB3C4 \uB2E4\uC6B4\uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD55C\uB2E4\uBA74, \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC81C\uAC70\uD55C \uD6C4, \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4.
m.unknown_error = \uBCF5\uAD6C\uB420 \uC218 \uC5C6\uB294 \uC624\uB958\uB85C \uC778\uD558\uC5EC \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC758 \uC2E4\uD589\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \
\n{0}\uC5D0 \uB300\uD55C \uBCF5\uAD6C \uBC29\uBC95\uC744 \uCC3E\uAE30 \uC704\uD574\uC11C \uBC29\uBB38\uD558\uC2DC\uAE38 \uBC14\uB78D\uB2C8\uB2E4.
m.init_error = \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uC544\uB798\uC640 \uAC19\uC740 \uC5D0\uB7EC\uB85C \uC2E4\uD589\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC5D0\uB7EC:\
\n{0}\n\n{1}\uC5D0 \uB300\uD55C \uBB38\uC81C \uD574\uACB0 \uBC29\uBC95\uC744 \uCC3E\uAE30 \uC704\uD574\uC11C \uBC29\uBB38\uD558\uC2DC\uAE38 \uBC14\uB78D\uB2C8\uB2E4.
m.readonly_error = \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uC124\uCE58\uB41C \uB514\uB809\uD1A0\uB9AC: \
\n{0}\n\uAC00 \uC77D\uAE30 \uC804\uC6A9\uC785\uB2C8\uB2E4. \uC77D\uAE30 \uAD8C\uD55C\uC774 \uC2B9\uC778\uB41C \uB809\uD1A0\uB9AC\uC5D0 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC124\uCE58\uD558\uC2DC\uAE38 \uBC14\uB78D\uB2C8\uB2E4.
m.missing_resource = \uB9AC\uC18C\uC2A4\uC758 \uC190\uC2E4\uB85C \uC778\uD558\uC5EC \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC758 \uC2E4\uD589\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. : \
\n{0}\n\n{1}\uC5D0 \uB300\uD55C \uBB38\uC81C \uD574\uACB0 \uBC29\uBC95\uC744 \uCC3E\uAE30 \uC704\uD574\uC11C \uBC29\uBB38\uD558\uC2DC\uAE38 \uBC14\uB78D\uB2C8\uB2E4.
m.insufficient_permissions_error = \uC774 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC758 \uB514\uC9C0\uD0C8 \uC11C\uBA85\uC744 \uD655\uC778\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \
\uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC2E4\uD589\uD558\uAE30 \uC704\uD574\uC11C \uB514\uC9C0\uD0C8 \uC11C\uBA85\uC744 \uD655\uC778\uD558\uC5EC \uC8FC\uC2ED\uC2DC\uC624. \
\n\n\uADF8\uB9AC\uACE0 \uB098\uC11C \uC6F9 \uBE0C\uB77C\uC6B0\uC800\uB97C \uB2EB\uACE0 \uB2E4\uC2DC \uC2DC\uC791\uD558\uC5EC \uC6F9\uD398\uC774\uC9C0\uB85C \uB3CC\uC544\uC640 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC7AC\uC2DC\uC791\uD574\uC8FC\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4. \
\uBCF4\uC548\uC5D0 \uB300\uD55C \uB300\uD654\uC0C1\uC790\uAC00 \uBCF4\uC774\uBA74, \uB514\uC9C0\uD0C8 \uC11C\uBA85\uC5D0 \uB300\uD55C \uD655\uC778 \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uACE0, \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uC2E4\uD589\uB418\uAE30 \uC704\uD55C \
\uAD8C\uD55C\uC744 \uBD80\uC5EC\uD574\uC8FC\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4.
m.corrupt_digest_signature_error = \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC758 \uB514\uC9C0\uD0C8 \uC11C\uBA85\uC744 \uD655\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n \
\uC62C\uBC14\uB978 \uC6F9\uC0AC\uC774\uD2B8\uC5D0\uC11C \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uC2E4\uD589\uB418\uACE0 \uC788\uB294 \uC9C0 \uD655\uC778\uBC14\uB78D\uB2C8\uB2E4.
m.default_install_error = \uC6F9\uC0AC\uC774\uD2B8\uC758 \uC9C0\uC6D0 \uBA54\uB274(support section)\uB97C \uD655\uC778\uD558\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4.
m.another_getdown_running = \uC774 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158 \uC778\uC2A4\uD1A8\uB7EC\uC758 \uB2E4\uC911 \uC778\uC2A4\uD134\uC2A4\uAC00 \uC2E4\uD589\uC911\uC785\uB2C8\uB2E4. \
\uD558\uB098\uAC00 \uC644\uB8CC\uB420 \uB54C\uAE4C\uC9C0 \uC911\uB2E8\uB429\uB2C8\uB2E4.
m.applet_stopped = Getdown \uC560\uD50C\uB9BF \uC2E4\uD589\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
# application/digest errors
m.missing_appbase = \uC124\uC815 \uD30C\uC77C\uC5D0 'appbase' \uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
m.invalid_version = \uC124\uC815 \uD30C\uC77C\uC5D0 \uC798\uBABB\uB41C \uBC84\uC804\uC774 \uBA85\uC2DC\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.
m.invalid_appbase = \uC124\uC815 \uD30C\uC77C\uC5D0 \uC798\uBABB\uB41C 'appbase'\uAC00 \uBA85\uC2DC\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.
m.missing_class = \uC124\uC815 \uD30C\uC77C\uC5D0 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158 \uD074\uB798\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
m.missing_code = \uC124\uC815 \uD30C\uC77C\uC5D0 \uB9AC\uC18C\uC2A4\uC5D0 \uB300\uD55C \uCF54\uB4DC\uAC00 \uBA85\uC2DC\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
m.invalid_digest_file = \uB2E4\uC774\uC81C\uC2A4\uD2B8 \uD30C\uC77C\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
@@ -0,0 +1,115 @@
#
# $Id$
#
# Getdown translation messages
m.abort_title = Cancelar a instala\u00E7\u00E3o?
m.abort_confirm = <html>Tem certeza que deseja cancelar a instala\u00E7\u00E3o? \
Voc\u00EA pode continuar a instala\u00E7\u00E3o mais tarde, \
basta executar a aplica\u00E7\u00E3o novamente.</html>
m.abort_ok = Sair
m.abort_cancel = Continuar a instala\u00E7\u00E3o
m.detecting_proxy = Tentando detectar automaticamente as configura\u00E7\u00F5es de proxy
m.configure_proxy = <html>N\u00E3o foi poss\u00EDvel conectar aos nossos servidores para \
fazer o download dos dados. \
<ul><li> Se o Firewall do Windows ou o Norton Internet Security est\u00E1 configurado \
para bloquear o programa <code>javaw.exe</code> n\u00E3o ser\u00E1 poss\u00EDvel realizar \
o download. Voc\u00EA ter\u00E1 que permitir que o programa <code>javaw.exe</code> acesse \
a internet. Voc\u00EA pode tentar executar o programa novamente, mas voc\u00EA precisa \
remover o programa javaw.exe das configura\u00E7\u00F5es do firewall (Iniciar -> Painel \
de controle -> Firewall do Windows).</ul> \
<p> Seu computador pode estar acessando a internet atrav\u00E9s de um proxy e n\u00E3o foi \
capaz de detectar automaticamente as configura\u00E7\u00F5es de proxy. \
Voc\u00EA pode informar esses dados abaixo.</html>
m.proxy_extra = <html>Se voc\u00EA tem certeza que n\u00E3o usa um proxy, ent\u00E3o pode ser \
que exista um problema tempor\u00E1rio que est\u00E1 impedindo a comunica\u00E7\u00E3o \
com os nossos servidores. Neste caso voc\u00EA pode cancelar e tentar instalar novamente \
mais tarde.</html>
m.proxy_host = IP do Proxy
m.proxy_port = Porta do Proxy
m.proxy_ok = OK
m.proxy_cancel = Cancelar
m.downloading_java = Fazendo o download da m\u00E1quina virtual Java
m.unpacking_java = Descompactando a m\u00E1quina virtual Java
m.resolving = Resolvendo downloads
m.downloading = Transferindo dados
m.failure = Download falhou: {0}
m.checking = Verificando atualiza\u00E7\u00F5es
m.validating = Validando
m.patching = Atualizando
m.launching = Executando
m.patch_notes = Corrigir notas
m.play_again = Jogar de novo
m.complete = {0}% completo
m.remain = {0} Permanecer
m.updating_metadata = Transferindo arquivos de controle
m.init_failed = Nosso arquivo de configura\u00E7\u00E3o est\u00E1 ausente ou corrompido. Tente \
baixar uma nova c\u00F3pia...
m.java_download_failed = N\u00E3o conseguimos baixar automaticamente a\
vers\u00E3o necess\u00E1ria do Java para o seu computador.\n\n\
Por favor, acesse www.java.com, baixe e instale a \u00FAltima vers\u00E3o do \
Java, em seguida, tente executar o aplicativo novamente.
m.java_unpack_failed = N\u00E3o conseguimos descompactar uma vers\u00E3o atualizada do \
Java. Por favor, certifique-se de ter pelo menos 100 MB de espa\u00E7o livre em seu \
disco r\u00EDgido e tente executar o aplicativo novamente. \n\n\
Se isso n\u00E3o resolver o problema, acesse www.java.com,baixe e \
instale a \u00FAltima vers\u00E3o do Java e tente novamente.
m.unable_to_repair = N\u00E3o conseguimos baixar os arquivos necess\u00E1rios depois de \
cinco tentativas. Voc\u00EA pode tentar executar o aplicativo novamente, mas se ele \
falhar pode ser necess\u00E1rio desinstalar e reinstalar.
m.unknown_error = A aplica\u00E7\u00E3o falhou ao iniciar devido a algum erro estranho \
do qual n\u00E3o conseguimos recuperar. Por favor, visite \n{0} para obter \
informa\u00E7\u00F5es sobre como recuperar.
m.init_error = A aplica\u00E7\u00E3o falhou ao iniciar devido ao seguinte \
erro:\n{0}\n\nPor favor visite \n{1} para \
informa\u00E7\u00F5es sobre como lidar com esse problema.
m.readonly_error =O diret\u00F3rio no qual este aplicativo est\u00E1 instalado: \
\n{0}\n \u00E9 somente leitura. Por favor, instale o aplicativo em um diret\u00F3rio onde \
voc\u00EA tem acesso de grava\u00E7\u00E3o.
m.missing_resource = A aplica\u00E7\u00E3o falhou ao iniciar devido a uma falta \
de recurso:\n{0}\n\n Por favor, visite\n{1} para obter informa\u00E7\u00F5es sobre \
como lidar com tal problema.
m.insufficient_permissions_error = Voc\u00EA n\u00E3o aceitou a assinatura digital \
do aplicativo. Se voc\u00EA quiser executar o aplicativo, voc\u00EA ter\u00E1 que aceitar \
a assinatura digital. \n\nPara fazer isso, voc\u00EA ter\u00E1 que sair do seu navegador, \
reinici\u00E1-lo, e retornar a esta p\u00E1gina web para executar a aplica\u00E7\u00E3o. \
Quando o di\u00E1logo de seguran\u00E7a aparecer, clique no bot\u00E3o para aceitar a \
assinatura digital e conceder a este aplicativo os privil\u00E9gios necess\u00E1rios \
para executar.
m.corrupt_digest_signature_error = N\u00E3o conseguimos verificar a assinatura digital \
do aplicativo.\nPor favor, verifique se voc\u00EA est\u00E1 utilizando o aplicativo \nde um \
site correto.
m.default_install_error = a se\u00E7\u00E3o de suporte do site
m.another_getdown_running = V\u00E1rias inst\u00E2ncias desta aplica\u00E7\u00E3o \
est\u00E3o em execu\u00E7\u00E3o. Esta ir\u00E1 parar e deixar outra completar suas atividades.
m.applet_stopped = Foi solicitado ao miniaplicativo GetDow que parasse de trabalhar.
# application/digest errors
m.missing_appbase = O arquivo de configura\u00E7\u00E3o n\u00E3o possui o 'AppBase'.
m.invalid_version = O arquivo de configura\u00E7\u00E3o especifica uma vers\u00E3o inv\u00E1lida.
m.invalid_appbase = O arquivo de configura\u00E7\u00E3o especifica um 'AppBase' inv\u00E1lido.
m.missing_class = O arquivo de configura\u00E7\u00E3o n\u00E3o possui a classe de aplicativo.
m.missing_code = O arquivo de configura\u00E7\u00E3o n\u00E3o especifica um recurso de c\u00F3digo.
m.invalid_digest_file = O arquivo digest \u00E9 inv\u00E1lido.
@@ -0,0 +1,58 @@
#
# $Id$
#
# Getdown translation messages
m.detecting_proxy = \u641c\u5bfb\u4ee3\u7406\u670d\u52a1\u5668
m.configure_proxy = <html>\u6211\u4eec\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0b\u8f7d\u6e38\u620f\u6570\u636e\u3002\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e \
\u60a8\u7684\u8ba1\u7b97\u673a\u662f\u901a\u8fc7\u4ee3\u7406\u670d\u52a1\u5668\u8fde\u63a5\u4e92\u8054\u7f51\u7684\uff0c\u5e76\u4e14\u6211\u4eec\u65e0\u6cd5\u81ea\u52a8\u83b7\u5f97\u4ee3\u7406\u670d\u52a1\u5668\u7684 \
\u8bbe\u7f6e\u3002\u5982\u679c\u60a8\u77e5\u9053\u60a8\u4ee3\u7406\u670d\u52a1\u5668\u7684\u8bbe\u7f6e\uff0c\u60a8\u53ef\u4ee5\u5728\u4e0b\u9762\u8f93\u5165\u3002</html>
m.proxy_extra = <html>\u5982\u679c\u60a8\u786e\u5b9a\u60a8\u6ca1\u6709\u4f7f\u7528\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u6682\u65f6\u65e0\u6cd5 \
\u8fde\u63a5\u5230\u4e92\u8054\u7f51\uff0c\u5bfc\u81f4\u65e0\u6cd5\u548c\u670d\u52a1\u5668\u901a\u8baf\u3002\u8fd9\u79cd\u60c5\u51b5\uff0c\u60a8\u53ef\u4ee5\u53d6\u6d88\uff0c\u7a0d\u5019\u518d\u91cd\u65b0\u5b89\u88c5\u3002<br><br> \
\u5982\u679c\u60a8\u65e0\u6cd5\u786e\u5b9a\u60a8\u662f\u5426\u4f7f\u7528\u4e86\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u8bf7\u8bbf\u95ee\u6211\u4eec\u7f51\u7ad9\u4e2d\u7684\u6280\u672f\u652f\u6301\u90e8\u4efd\uff0c \
\u4e86\u89e3\u5982\u4f55\u68c0\u6d4b\u60a8\u7684\u4ee3\u7406\u670d\u52a1\u5668\u8bbe\u7f6e\u3002</html>
m.proxy_host = \u4ee3\u7406\u670d\u52a1\u5668\u7684IP\u5730\u5740
m.proxy_port = \u4ee3\u7406\u670d\u52a1\u5668\u7684\u7aef\u53e3\u53f7
m.proxy_ok = \u786e\u5b9a
m.proxy_cancel = \u53d6\u6d88
m.resolving = \u5206\u6790\u9700\u4e0b\u8f7d\u5185\u5bb9
m.downloading = \u4e0b\u8f7d\u6570\u636e
m.failure = \u4e0b\u8f7d\u5931\u8d25: {0}
m.checking = \u68c0\u67e5\u66f4\u65b0\u5185\u5bb9
m.validating = \u786e\u8ba4
m.patching = \u5347\u7ea7
m.launching = \u542f\u52a8
m.complete = {0}% \u5b8c\u6210
m.remain = {0} \u5269\u4f59\u65f6\u95f4
m.updating_metadata = \u4e0b\u8f7d\u63a7\u5236\u6587\u4ef6
m.init_failed = \u65e0\u6cd5\u627e\u5230\u914d\u7f6e\u6587\u4ef6\u6216\u5df2\u635f\u574f\u3002\u5c1d\u8bd5\u91cd\u65b0\u4e0b\u8f7d...
m.unable_to_repair = \u7ecf\u8fc75\u6b21\u5c1d\u8bd5\uff0c\u4f9d\u7136\u65e0\u6cd5\u4e0b\u8f7d\u6240\u9700\u7684\u6587\u4ef6\u3002\
\u60a8\u53ef\u4ee5\u91cd\u65b0\u8fd0\u884c\u7a0b\u5e8f\uff0c\u4f46\u662f\u5982\u679c\u4f9d\u7136\u5931\u8d25\uff0c\u60a8\u53ef\u80fd\u9700\u8981\u53cd\u5b89\u88c5\u5e76\u91cd\u65b0\u5b89\u88c5\u3002
m.unknown_error = \u7531\u4e8e\u4e00\u4e9b\u65e0\u6cd5\u56de\u590d\u7684\u4e25\u91cd\u9519\u8bef\uff0c\u7a0b\u5e8f\u542f\u52a8\u5931\u8d25\u3002\
\u8bf7\u8bbf\u95ee\u6211\u4eec\u7684\u7f51\u7ad9\u7684\u6280\u672f\u652f\u6301\u90e8\u4efd\uff0c\u4e86\u89e3\u5982\u4f55\u89e3\u51b3\u95ee\u9898\u3002
m.init_error = \u7531\u4e8e\u4e0b\u5217\u9519\u8bef\uff0c\u7a0b\u5e8f\u542f\u52a8\u5931\u8d25\uff1a\n{0}\n\n \
\u8bf7\u8bbf\u95ee\u6211\u4eec\u7684\u7f51\u7ad9\u7684\u6280\u672f\u652f\u6301\u90e8\u4efd\uff0c\u4e86\u89e3\u5982\u4f55\u5904\u7406\u8fd9\u4e9b\u9519\u8bef\u3002
m.missing_resource = \u7531\u4e8e\u65e0\u6cd5\u627e\u5230\u4e0b\u5217\u8d44\u6e90\uff0c\u7a0b\u5e8f\u542f\u52a8\u5931\u8d25\uff1a\n{0}\n\n \
\u8bf7\u8bbf\u95ee\u6211\u4eec\u7684\u7f51\u7ad9\u7684\u6280\u672f\u652f\u6301\u90e8\u4efd\uff0c\u4e86\u89e3\u5982\u4f55\u5904\u7406\u8fd9\u4e9b\u95ee\u9898\u3002
# application/digest errors
m.missing_appbase = \u914d\u7f6e\u6587\u4ef6\u4e2d\u65e0\u6cd5\u627e\u5230 'appbase'\u3002
m.invalid_version = \u914d\u7f6e\u6587\u4ef6\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u7248\u672c\u3002
m.invalid_appbase = \u914d\u7f6e\u6587\u4ef6\u6307\u5b9a\u4e86\u65e0\u6548\u7684 'appbase'\u3002
m.missing_class = \u914d\u7f6e\u6587\u4ef6\u4e2d\u65e0\u6cd5\u627e\u5230\u7a0b\u5e8f\u6587\u4ef6\u3002
m.missing_code = \u914d\u7f6e\u6587\u4ef6\u4e2d\u65e0\u6cd5\u627e\u5230\u6307\u5b9a\u7684\u8d44\u6e90\u3002
m.invalid_digest_file = \u65e0\u6548\u7684\u914d\u7f6e\u6587\u4ef6\u3002