?? translate.java
字號:
if (bundleVariant == null) {
Locale l = new Locale(bundleLanguage, bundleCountry);
bundleVariant = l.getVariant();
}
if (toDir == null) {
throw new BuildException("The todir attribute must be set.",
getLocation());
}
if (!toDir.exists()) {
toDir.mkdirs();
} else {
if (toDir.isFile()) {
throw new BuildException(toDir + " is not a directory");
}
}
if (srcEncoding == null) {
srcEncoding = System.getProperty("file.encoding");
}
if (destEncoding == null) {
destEncoding = srcEncoding;
}
if (bundleEncoding == null) {
bundleEncoding = srcEncoding;
}
loadResourceMaps();
translate();
}
/**
* Load resource maps based on resource bundle encoding scheme.
* The resource bundle lookup searches for resource files with various
* suffixes on the basis of (1) the desired locale and (2) the default
* locale (basebundlename), in the following order from lower-level
* (more specific) to parent-level (less specific):
*
* basebundlename + "_" + language1 + "_" + country1 + "_" + variant1
* basebundlename + "_" + language1 + "_" + country1
* basebundlename + "_" + language1
* basebundlename
* basebundlename + "_" + language2 + "_" + country2 + "_" + variant2
* basebundlename + "_" + language2 + "_" + country2
* basebundlename + "_" + language2
*
* To the generated name, a ".properties" string is appeneded and
* once this file is located, it is treated just like a properties file
* but with bundle encoding also considered while loading.
*/
private void loadResourceMaps() throws BuildException {
Locale locale = new Locale(bundleLanguage,
bundleCountry,
bundleVariant);
String language = locale.getLanguage().length() > 0 ?
"_" + locale.getLanguage() :
"";
String country = locale.getCountry().length() > 0 ?
"_" + locale.getCountry() :
"";
String variant = locale.getVariant().length() > 0 ?
"_" + locale.getVariant() :
"";
String bundleFile = bundle + language + country + variant;
processBundle(bundleFile, 0, false);
bundleFile = bundle + language + country;
processBundle(bundleFile, 1, false);
bundleFile = bundle + language;
processBundle(bundleFile, 2, false);
bundleFile = bundle;
processBundle(bundleFile, 3, false);
//Load default locale bundle files
//using default file encoding scheme.
locale = Locale.getDefault();
language = locale.getLanguage().length() > 0 ?
"_" + locale.getLanguage() :
"";
country = locale.getCountry().length() > 0 ?
"_" + locale.getCountry() :
"";
variant = locale.getVariant().length() > 0 ?
"_" + locale.getVariant() :
"";
bundleEncoding = System.getProperty("file.encoding");
bundleFile = bundle + language + country + variant;
processBundle(bundleFile, 4, false);
bundleFile = bundle + language + country;
processBundle(bundleFile, 5, false);
bundleFile = bundle + language;
processBundle(bundleFile, 6, true);
}
/**
* Process each file that makes up this bundle.
*/
private void processBundle(final String bundleFile, final int i,
final boolean checkLoaded) throws BuildException {
final File propsFile = new File(bundleFile + ".properties");
FileInputStream ins = null;
try {
ins = new FileInputStream(propsFile);
loaded = true;
bundleLastModified[i] = propsFile.lastModified();
log("Using " + propsFile, Project.MSG_DEBUG);
loadResourceMap(ins);
} catch (IOException ioe) {
log(propsFile + " not found.", Project.MSG_DEBUG);
//if all resource files associated with this bundle
//have been scanned for and still not able to
//find a single resrouce file, throw exception
if (!loaded && checkLoaded) {
throw new BuildException(ioe.getMessage(), getLocation());
}
}
}
/**
* Load resourceMap with key value pairs. Values of existing keys
* are not overwritten. Bundle's encoding scheme is used.
*/
private void loadResourceMap(FileInputStream ins) throws BuildException {
try {
BufferedReader in = null;
InputStreamReader isr = new InputStreamReader(ins, bundleEncoding);
in = new BufferedReader(isr);
String line = null;
while ((line = in.readLine()) != null) {
//So long as the line isn't empty and isn't a comment...
if (line.trim().length() > 1 &&
('#' != line.charAt(0) || '!' != line.charAt(0))) {
//Legal Key-Value separators are :, = and white space.
int sepIndex = line.indexOf('=');
if (-1 == sepIndex) {
sepIndex = line.indexOf(':');
}
if (-1 == sepIndex) {
for (int k = 0; k < line.length(); k++) {
if (Character.isSpaceChar(line.charAt(k))) {
sepIndex = k;
break;
}
}
}
//Only if we do have a key is there going to be a value
if (-1 != sepIndex) {
String key = line.substring(0, sepIndex).trim();
String value = line.substring(sepIndex + 1).trim();
//Handle line continuations, if any
while (value.endsWith("\\")) {
value = value.substring(0, value.length() - 1);
if ((line = in.readLine()) != null) {
value = value + line.trim();
} else {
break;
}
}
if (key.length() > 0) {
//Has key already been loaded into resourceMap?
if (resourceMap.get(key) == null) {
resourceMap.put(key, value);
}
}
}
}
}
if (in != null) {
in.close();
}
} catch (IOException ioe) {
throw new BuildException(ioe.getMessage(), getLocation());
}
}
/**
* Reads source file line by line using the source encoding and
* searches for keys that are sandwiched between the startToken
* and endToken. The values for these keys are looked up from
* the hashtable and substituted. If the hashtable doesn't
* contain the key, they key itself is used as the value.
* Detination files and directories are created as needed.
* The destination file is overwritten only if
* the forceoverwritten attribute is set to true if
* the source file or any associated bundle resource file is
* newer than the destination file.
*/
private void translate() throws BuildException {
for (int i = 0; i < filesets.size(); i++) {
FileSet fs = (FileSet) filesets.elementAt(i);
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
String[] srcFiles = ds.getIncludedFiles();
int srcFilesCount = srcFiles.length;
if (srcFilesCount == 1) {
log("Translating 1 file", Project.MSG_INFO);
} else {
log("Translating " + srcFilesCount + " files", Project.MSG_INFO);
}
for (int j = 0; j < srcFiles.length; j++) {
try {
File dest = fileUtils.resolveFile(toDir, srcFiles[j]);
//Make sure parent dirs exist, else, create them.
try {
File destDir = new File(dest.getParent());
if (!destDir.exists()) {
destDir.mkdirs();
}
} catch (Exception e) {
log("Exception occured while trying to check/create "
+ " parent directory. " + e.getMessage(),
Project.MSG_DEBUG);
}
destLastModified = dest.lastModified();
File src = fileUtils.resolveFile(ds.getBasedir(), srcFiles[j]);
srcLastModified = src.lastModified();
//Check to see if dest file has to be recreated
if (forceOverwrite
|| destLastModified < srcLastModified
|| destLastModified < bundleLastModified[0]
|| destLastModified < bundleLastModified[1]
|| destLastModified < bundleLastModified[2]
|| destLastModified < bundleLastModified[3]
|| destLastModified < bundleLastModified[4]
|| destLastModified < bundleLastModified[5]
|| destLastModified < bundleLastModified[6]) {
log("Processing " + srcFiles[j],
Project.MSG_DEBUG);
FileOutputStream fos = new FileOutputStream(dest);
BufferedWriter out
= new BufferedWriter(new OutputStreamWriter(fos, destEncoding));
FileInputStream fis = new FileInputStream(src);
BufferedReader in
= new BufferedReader(new InputStreamReader(fis, srcEncoding));
String line;
while ((line = in.readLine()) != null) {
int startIndex = -1;
int endIndex = -1;
outer: while (true) {
startIndex = line.indexOf(startToken, endIndex + 1);
if (startIndex < 0 ||
startIndex + 1 >= line.length()) {
break;
}
endIndex = line.indexOf(endToken, startIndex + 1);
if (endIndex < 0) {
break;
}
String matches = line.substring(startIndex + 1,
endIndex);
//log("match = " + matches + " resource = " + (String) resourceMap.get(matches), Project.MSG_WARN);
/**
* Note: minhnn
* I change the code to consider a valid
* matches must begin with mvnforum
*/
if (matches.startsWith("mvnforum.") == false ) {
endIndex = endIndex - 1;
continue outer;
}
//If there is a white space or = or :, then
//it isn't to be treated as a valid key.
for (int k = 0; k < matches.length(); k++) {
char c = matches.charAt(k);
if (c == ':' ||
c == '=' ||
Character.isSpaceChar(c)) {
endIndex = endIndex - 1;
continue outer;
}
}
String replace = null;
replace = (String) resourceMap.get(matches);
//If the key hasn't been loaded into resourceMap,
//use the key itself as the value also.
if (replace == null) {
log("Warning: The key: " + matches
+ " hasn't been defined.",
Project.MSG_WARN);
replace = matches;
}
line = line.substring(0, startIndex)
+ replace
+ line.substring(endIndex + 1);
// minhnn: I dont know if the original code has bug
// I changed from "+ 1" to "- 1" and it works well
endIndex = startIndex + replace.length() - 1;
if (endIndex + 1 >= line.length()) {
break;
}
}
out.write(line);
out.newLine();
}
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} else {
log("Skipping " + srcFiles[j] +
" as destination file is up to date",
Project.MSG_VERBOSE);
}
} catch (IOException ioe) {
throw new BuildException(ioe.getMessage(), getLocation());
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -