the code below is not giving me the answer i want, i don't know where is the problem?
FR is the translation of EN (exactly like .properties file)
i want to read the translation from the FR.java file if
i want to reach the hello variable of fr.java or en.java from the index.jsp page. but code i wrote gives me the value from Lang.java
String language = "FR";
the condition is in the .jsp file
jdk 1.4 gives me this error :Error(23,23): variable lang might not have been initialized
any body can help, code pleas?
file name Lang.java
package mypackage;
abstract public class Lang {
public String hello= "home page";
}
filename EN.java
package mypackage;
public class EN extends Lang {
public String hello = "hello";
}
filename FR.java
package mypackage;
public class FR extends Lang {
public String hello = "bonjour";
}
file name : index.jsp
<%@ page contentType="text/html;charset=windows-1252"%>
<%@ page import="mypackage.Lang" %>
<%@ page import="mypackage.FR" %>
<%@ page import="mypackage.EN" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>language</title>
</head>
<body>
<%
String language = "EN";
Lang lang;
if (language.equals("EN")){
lang = new EN();
}
else if (language.equals("FR")){
lang = new FR();
}
%>
<%
out.print(lang.hello);
%>
</body>
</html>
Change the condition as follows:
if (language.equals("FR")){
lang = new FR();
}
// add more languages here
// example:
// else if (language.equals("DE")) {
// lang = new DE();
// }
else {
lang = new EN();
}
Your code does not cater with the case where language
is neither "EN" nor "FR". Pick a default language so that the lang
variable is always initialised:
Lang lang;
if (language.equals("EN")){
lang = new EN();
}
else // default case
lang = new FR();
}
In addition, instead of declaring one attribute for each string that needs to be translated (e.g. String home
) consider declaring a method that will take a "key" as a parameter, and return the corresponding translation for that key. For example, in your JSP you could use something like this:
out.print(lang.getString("home"));
Then have all your Lang
subclasses return the proper, translated value for each key.
You might also want to have a look at ResourceBundles.
<%
String language = "EN";
Lang lang;
if (language.equals("EN")){
lang = new EN();
}
else if (language.equals("FR")){
lang = new FR();
}
%>
Here it can be the case where language stays un initialized so you need to initialize it
say
Lang lang = null;//or any default value
And to initialize local variable is compulsary
I don't understand the importance of this condition here you are assigning "EN"
to language then what is the need of condition?
If language
is not equals to EN
or FR
then Lang lang
will not be initialized. Set it explicitly to new EN()
before the if
.
Set a default value for the lang variable:
Lang lang = new EN();
if (language.equals("EN")){
lang = new EN();
}
else if (language.equals("FR")){
lang = new FR();
}
If you wanted to print hello variable, declare that variable in abstract Lang class and initialize in concrete classes.
package mypackage;
abstract public class Lang {
public String hello= "home page";
}
filename EN.java
package mypackage;
public class EN extends Lang {
{
hello = "hello";
}
}
filename FR.java
package mypackage;
public class FR extends Lang {
{
hello = "bonjour";
}
}