我在資產文件夾中有幾個html文件。我如何本地化他們?我唯一的選擇是讓硬編碼根據語言環境選擇正確的文件嗎?資產文件本地化
資產文件本地化
回答
這是不直接支持,但這裏是我做了什麼......
獨立文件放入由國家代碼組(就像你正常的資源文件做什麼),然後創建一個本地化的字符串每個本地化的string.xml文件都被稱爲「前綴」(例如前綴爲英語「en」)。
然後,當你建立你的資產文件名簡單地使用像getString("prefix") + "-" + "<name-of-asset->
。
以上至少有一些變化應該適合你。
謝謝閱讀HTML的教程!改進你的想法,我可以使用Locale.getLanguage()。substring(0,2).toLowerCase()來獲得這個前綴,所以我不需要在string.xml中添加前綴var – mishkin 2011-03-25 03:04:15
請注意'getLanguage()。 substring(0,2)'不是android中的versitle方法,因爲'zh-rTW'(taiwanese又名繁體中文。zh是簡體中文)無法處理。 – Youngjae 2013-12-22 11:39:57
優秀的解決方案。我使用這種變化將資產置於assets/en/...,assets/es/...等等。好的一點是,如果您在strings.xml中定義了前綴,那麼您知道目錄將存在於資產中(只要您在每次添加新的本地化版本的strings.xml時製作目錄)。我正在使用它來本地化不僅html而且其他一些資產。 – mkasberg 2015-06-29 00:19:46
嘗試使用assets-ja
本地化將不起作用,因爲可悲的是這些不是資源文件。最好的選擇是以正確的語言環境以編程方式進行本地化。或者,HTML文件的內容只是純文本。例如,如果它符合您的項目,則可以嘗試將此字符串存儲爲新文件夾(或您自己的myHtmlText.xml
?)文件中的條目。
我需要使用資產,因爲HTML中的嵌入式圖像不會從原始的工作。但如果它是一個簡單的html,那麼你是對的,raw就是要走的路。這裏是誰可能會好奇如何從原始http://www.monocube.com/2011/02/08/android-tutorial-html-file-in-webview/ – mishkin 2011-03-25 03:07:14
如果你想本地化HTML文件,你可以簡單地把它放在RES/RAW-<語言> /filename.html(其中<語言> = EN,ES,FR,IT等),那麼訪問它從您的代碼與資源ID R.raw.filename。該框架將根據語言環境選擇正確的文件。
將文件放入raw-LOCALE文件夾將自動選擇正確的位置,但是如果您在webView中加載這些文件,使用Proguard進行混淆後,路徑將會中斷。
Proguard Breaks Android WebView, Why?
那麼唯一的解決辦法是使用資產文件夾,並使用文件語言環境,並挑選了正確的文件。
使用每個國家碼的一個文件(如在Andrew White's和PJ_Finnegan's答案中描述)的替代方法是定義HTML僅一次(例如,在assets
文件夾),並使用@string
標識在它,像這樣
<html>
<body>
<p>@string/message_text</p>
</body>
</html>
裝載資產轉換成字符串後,你可以它的內容傳遞給replaceResourceStrings()
:
/**
* Regex that matches a resource string such as <code>@string/a-b_c1</code>.
*/
private static final String REGEX_RESOURCE_STRING = "@string/([A-Za-z0-9-_]*)";
/** Name of the resource type "string" as in <code>@string/...</code> */
private static final String DEF_TYPE_STRING = "string";
/**
* Recursively replaces resources such as <code>@string/abc</code> with
* their localized values from the app's resource strings (e.g.
* <code>strings.xml</code>) within a <code>source</code> string.
*
* Also works recursively, that is, when a resource contains another
* resource that contains another resource, etc.
*
* @param source
* @return <code>source</code> with replaced resources (if they exist)
*/
public static String replaceResourceStrings(Context context, String source) {
// Recursively resolve strings
Pattern p = Pattern.compile(REGEX_RESOURCE_STRING);
Matcher m = p.matcher(source);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String stringFromResources = getStringByName(context, m.group(1));
if (stringFromResources == null) {
Log.w(Constants.LOG,
"No String resource found for ID \"" + m.group(1)
+ "\" while inserting resources");
/*
* No need to try to load from defaults, android is trying that
* for us. If we're here, the resource does not exist. Just
* return its ID.
*/
stringFromResources = m.group(1);
}
m.appendReplacement(sb, // Recurse
replaceResourceStrings(context, stringFromResources));
}
m.appendTail(sb);
return sb.toString();
}
/**
* Returns the string value of a string resource (e.g. defined in
* <code>values.xml</code>).
*
* @param name
* @return the value of the string resource or <code>null</code> if no
* resource found for id
*/
public static String getStringByName(Context context, String name) {
int resourceId = getResourceId(context, DEF_TYPE_STRING, name);
if (resourceId != 0) {
return context.getString(resourceId);
} else {
return null;
}
}
/**
* Finds the numeric id of a string resource (e.g. defined in
* <code>values.xml</code>).
*
* @param defType
* Optional default resource type to find, if "type/" is not
* included in the name. Can be null to require an explicit type.
*
* @param name
* the name of the desired resource
* @return the associated resource identifier. Returns 0 if no such resource
* was found. (0 is not a valid resource ID.)
*/
private static int getResourceId(Context context, String defType,
String name) {
return context.getResources().getIdentifier(name, defType,
context.getPackageName());
}
這種方法的好處是,你必須指定HTML的結構只有一次,並使用android's localization mechanism。另外,它允許在strings.xml中遞歸引用字符串,這不受Context.getResources()
的支持。例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="message_text">Some string @string/another_one.</string>
</resources>
的缺點是,解析是在運行時完成,因此指定一個專門的HTML代碼中每一種語言都有應用程序中使用時有更好的表現。
有關採用此代碼到HTML從資產文件轉換爲「風格化」 CharSequence
(使用Kuitsi's TagHandler),其可以被顯示在一個TextView
一個例子見TextUtil
。
將您的文件放入具有本地後綴的資產文件夾中。爲每個文件定義一個字符串資源「myLocalizedFileName」,並通過R.string.myLocalizedFileName獲取文件名。
實施例:
文件夾結構:
<resource>
<string name=helpFile>help.html</string>
</resource>
web視圖主叫:
public class HelpActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
...
findViewById(R.id.helpWebView)
.loadUrl("file:///android_asset/"
+ getString(R.string.helpFile));
}
}
這似乎是最乾淨的解決方案 - 謝謝! – 2015-11-11 17:33:06
感謝您的方法,尼斯和乾淨 – 2015-12-21 18:14:12
良好的解決方案保存字符串資源的路徑 – 2016-06-10 10:38:55
- 1. 使用本地資產來覆蓋寶石文件資產
- 2. Android中的可本地化資產
- 3. asp.net本地化資源顯式本地化不加載本地化文件
- 4. 本地化使用資源文件
- 5. 重複的本地化資源文件
- 6. 本地化使用資源文件
- 7. C#本地化和資源文件
- 8. 本地化 - CMS或資源文件?
- 9. WP7本地化和資源文件
- 10. 在包含資產的資產中讀取文本文件
- 11. 資源本地化
- 12. 正確地找到資產庫中的資產文件
- 13. VueJs本地資產路徑
- 14. VueJS 2:本地資產
- 15. .NET中的文本文件資源本地化
- 16. 使用資源文件在treeview中本地化節點文本
- 17. mvc 3本地化全球化使用資源文件
- 18. Android:從資產文件夾讀取文本並格式化文本
- 19. 如何解析資產中的本地JSON文件?
- 20. Android WebView遠程URL與資產中的本地字體文件?
- 21. Android Studio資產未加載本地HTML文件
- 22. 檢測清單文件,假設資產在本地
- 23. Silex資產文件
- 24. 本地化mscorlib.dll中資源
- 25. REST和本地化資源
- 26. Android本地化資源
- 27. 資源本地化xaml
- 28. Vala,資源和本地化
- 29. 本地化傳統產品?
- 30. 使用資產中的圖像進行圖像本地化
用於在res /值/ strings.xml中的每一種語言的字符串資源我需要使用資產,因爲emb在HTML中編輯圖像不會從原始資源中工作。如果它是一個簡單的html,raw就是要走的路。這裏是誰可能會好奇如何從原始monocube.com讀取HTML的人的教程2011/02/08/android-tutorial-html-file-in-webview – mishkin 2014-09-25 03:04:38