Download Stocks.java source file
View/Download Base (U.S. English) Properties file
// Stocks.java - An applet to demonstrate some features of // internationalization. Adopted from "Portfolio.java" in // "Java Examples in a Nutshell" by David Flanagan, O'Reilly // And Associates, 1997. pp. 280-281. // Written 1/2000 by Wayne Pollock, Tampa Florida USA. /* <APPLET CODE="Stocks" HEIGHT="350" WIDTH="500"> <PARAM NAME="Language" VALUE="fr"> <PARAM NAME="Country" VALUE="FR"> </APPLET> */ import java.applet.*; import java.awt.*; import java.text.*; import java.util.*; public class Stocks extends Applet { private Locale locale, requestedLocale, defaultLocale; private NumberFormat number, price, percent; private DateFormat shortDate, fullTime; public void init () { Position[] positions = new Position[3]; // Get a calendar for the default time zone & locale: Calendar cal = Calendar.getInstance(); cal.set( 1996, 6, 15 ); positions[0] = new Position( "XXX", 400, cal.getTime(), 11.90, 13.00 ); cal.set( 1996, 9, 14 ); positions[1] = new Position( "YYY", 1100, cal.getTime(), 71.09, 27.25 ); cal.set( 1991, 6, 27 ); positions[2] = new Position( "ZZZ", 6000, cal.getTime(), 23.37, 89.12 ); Date lastQuoteTime = new Date(); setLocalesAndFormatters(); // Use a ResourceBundle to get localized text strings. For simple text // strings the ResourceBundle is sufficient, but for complex messages (with // embeded variables such as dates), we must turn to the MessageFormat class. ResourceBundle msgs = ResourceBundle.getBundle( "StocksMsgs", locale ); MessageFormat mf = new MessageFormat( msgs.getString( "PortValue" ) ); mf.setLocale( locale ); // Due to a Java bug, you can't set a timezone for a MessageFormat. So // you can't use the built-in date formatting, you must create your own // DateFormat, then tell the MessageFormat object to use it for a // specific argument. (That's why two copies of lastQuoteTime are used.) mf.setFormat( 0, fullTime ); Object [] msgArgs = { lastQuoteTime, lastQuoteTime }; String text = "\n\t" + mf.format( msgArgs ) + "\n"; text += msgs.getString( "Symbol" ) + "\t"; text += msgs.getString( "Shares" ) + "\t"; text += msgs.getString( "BoughtOn" ) + "\t"; text += msgs.getString( "At" ) + "\t"; text += msgs.getString( "Quote" ) + "\t"; text += msgs.getString( "Change" ) + "\n"; for ( int i = 0; i < positions.length; ++i ) { Position pos = positions[i]; text += pos.symbol + "\t"; text += number.format( pos.shares ) + "\t"; text += shortDate.format( pos.purchased ) + "\t\t"; text += price.format( pos.bought ) + "\t"; text += price.format( pos.current ) + "\t"; double change = ( pos.current - pos.bought ) / pos.bought; text += percent.format( change ) + "\n"; } TextArea ta = new TextArea( text ); add( ta ); setLayout( null ); ta.setSize( this.getSize() ); setVisible( true ); } private void setLocalesAndFormatters () { // Need to determine what locale (language and country) the // user has set. Even if this returns the non-default locale, // it may be that the user has selected a locale we don't // support with this program. A properly internationalized // program will have a language menu the user can use to select // a proper language (and country variant, such as French-Canadian // or French-France. For now, this method constructs the requested // locale from the applet's parameters, and tries to create number // and date formatters from it. Should this fail, we try to construct // formatters from the current locale. If that fails also, we use // the standard ENGLISH locale. Note the final setting of "locale" // is the locale used for the date, as this is needed later when // constructing a localized message containing a date. defaultLocale = getLocale(); // Get the current locale. String countryCode = getParameter( "Country" ); if ( countryCode == null ) countryCode = ""; String languageCode = getParameter( "Language" ); if ( languageCode == null ) languageCode = defaultLocale.getLanguage(); requestedLocale = new Locale( languageCode, countryCode ); // With no arguments the following methods return formatter // objects for the default locale. Other than currency, percent, // dates and times, and plain numbers, you must localize the values // yourself. (For example, do we use inches or centimeters?) locale = requestedLocale; number = NumberFormat.getInstance( locale ); if ( number == null ) // requested locale not supported, use default: { locale = defaultLocale; number = NumberFormat.getInstance( locale ); } price = NumberFormat.getCurrencyInstance( locale ); percent = NumberFormat.getPercentInstance( locale ); // DateFormatters don't necessarily support the same locales as numbers: locale = requestedLocale; shortDate = DateFormat.getDateInstance( DateFormat.SHORT, locale ); if ( shortDate == null ) // requested locale not supported, use default: { locale = defaultLocale; shortDate = DateFormat.getDateInstance( DateFormat.SHORT, locale ); } fullTime = DateFormat.getTimeInstance( DateFormat.FULL, locale ); try { TimeZone tz = TimeZone.getTimeZone( System.getProperty( "user.timezone" ) ); shortDate.setTimeZone( tz ); fullTime.setTimeZone( tz ); } catch ( Exception ignored ) {} } static class Position { String symbol; // Symbol (name) of the stock int shares; // Number of shares held Date purchased; // When purchased double bought, current; // Purchase and current price per share Position ( String symbol, int shares, Date purchased, double bought, double current ) { this.symbol = symbol; this.shares = shares; this.purchased = purchased; this.bought = bought; this.current = current; } } }
Download Base (U.S. English) Properties file
PortValue = Portfolio value as of {0} on {1,date,long}: Symbol = Symbol Shares = Shares BoughtOn = Bought on At = At Quote = Quote Change = Change
Download French Properties file
PortValue = Valeur de brochure en date de {0} sur {1,date,long}: Symbol = Symbole Shares = Parts BoughtOn = Acheté sur At = À Quote = Guillemet Change = Différence
Download Spanish Properties file
PortValue = Valor de la lista en fecha {0} en {1,date,long}: Symbol = Símbolo Shares = Partes BoughtOn = Comprado en At = En Quote = Cotización Change = Diferencia