單超文本框,默認安裝的組件中是找不到的,需要使用擴展支持庫才能使用這個組件。
接下來我們說說“超文本”這個詞,簡單的說易語言簡單超文本框就是HTML中的<a>超鏈接。
窗口預覽:
我們先創建一個windows窗口程序,在窗口中繪制簡單超文本框組件
在簡單超文本框中右鍵,選擇設置超文本菜單。然后編寫HTML<a>代碼:
當然也可以使用組件的屬性的賦值功能來設置超文本的內容,這里的超文本為字節集,所有需要把文本轉換為字節集數據,然后再賦值:
當然這樣的直接<a>字體會顯示藍色,我們也可以在“層疊樣式表CSS”中來設置字體的顏色:
本期的介紹簡單超文本框就到這里。我們下期再見。
者 | Hemanth Murali
譯者 | 張衛濱
策劃 | Tina
你是否已經涉足 Web 開發的汪洋大海?如果答案是肯定的,那你很快就會意識到,Web 不僅僅是為英語使用者服務的,它是面向全球的。假設法國用戶看到了一條令人困惑的純英文錯誤信息,在你被類似的投訴淹沒之前,我們先來討論一下什么是國際化(internationalization,通常簡寫為 i18n)和本地化。
想象一下,在這個世界上,無論每個人的母語是什么,你的軟件都可以與他們流暢地交流。這就是國際化和本地化要實現的目標。雖然乍看上去沒啥特別之處,但是請記住,本地化應用程序不僅僅是翻譯文本。而是要根據用戶的文化、地區和語言偏好提供量身定制的體驗。
但是,這里有個障礙在等著你。深入了解 i18n 庫的工具箱,你會發現以 JavaScript 為核心的解決方案占據了主導地位,尤其是那些圍繞 React 的解決方案(如 i18next、react-intl 和 react-i18next )。
如果跳出 JavaScript 的范疇,可選的方案就會越來越少。更糟糕的是,這些現成的工具通常都帶有“一刀切”的特點,缺乏適配特定用例的能力。
不過,不必擔心!如果鞋子不合適的話,為何不自己動手做呢?請繼續往下閱讀,我們將指導你從頭開始構建一個國際化框架:一個為你的應用程序量身定制、跨語言和跨框架的解決方案。
準備好為你的應用程序簽發全球通行證了嗎?讓我們開始這段旅程吧。
掌握國際化精髓的一個簡單方法就是使用一個函數,該函數能夠根據用戶所在的地域獲取信息。如下是一個使用 Java 編寫的樣例,它提供了一個基本但有效的方法:
public class InternationalizationExample {
public static void main(String[] args) {
System.out.println(getWelcomeMessage(getUserLocale()));
}
public static String getWelcomeMessage(String locale) {
switch (locale) {
case "en_US":
return "Hello, World!";
case "fr_FR":
return "Bonjour le Monde!";
case "es_ES":
return "Hola Mundo!";
default:
return "Hello, World!";
}
}
public static String getUserLocale() {
// This is a placeholder method. In a real-world scenario,
// you'd fetch the user's locale from their settings or system configuration.
return "en_US"; // This is just an example.
}
}
復制代碼
在上面的樣例中,getWelcomeMessage 根據 locale 指定的語言返回歡迎信息。語言是由 getUserLocale 方法確定的。這種方法雖然非常基礎,但是展示了根據用戶特定的本地語言提供內容的原則。但是,隨著內容的進展,我們將深入研究更先進的技術,并了解為何這種基礎的方式對于大型應用程序可能無法具備可擴展性和高效率。
在前一種方法的基礎之上,我們努力保留其優點,同時解決其缺點。為了實現這一點,我們將代碼庫中的硬編碼字符串值過渡到基于配置的設置。我們會為每種本地語言使用單獨的配置文件,并以 JSON 格式進行編碼。這種模塊化方式簡化了翻譯的添加和修改,無需進行代碼的變更。
如下是英語和西班牙語本地語言的配置文件:
文件名:en.json
{ "welcome_message": "Hello, World"}
復制代碼
文件名:es.json
{ "welcome_message": "Hola, Mundo"}
復制代碼
首先,我們需要一種讀取 JSON 文件的方式。這通常會使用像 Jackson 或 GSON 這樣的庫。在本例中,我們將使用 Jackson。
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.Map;
public class Internationalization {
private static final String CONFIG_PATH = "/path_to_configs/";
private Map<String, String> translations;
public Internationalization(String locale) throws IOException {
ObjectMapper mapper = new ObjectMapper();
translations = mapper.readValue(new File(CONFIG_PATH + locale + ".json"), Map.class);
}
public String getTranslation(String key) {
return translations.getOrDefault(key, "Key not found!");
}
}
public static class Program {
public static void main(String[] args) throws IOException {
Internationalization i18n = new Internationalization(getUserLocale());
System.out.println(i18n.getTranslation("welcome_message"));
}
private static String getUserLocale() {
// This method should be implemented to fetch the user's locale.
// For now, let's just return "en" for simplicity.
return "en";
}
}
復制代碼
Internationalization 類在實例化的時候,會根據提供的本地語言讀取上述代碼中相關的 JSON 配置。getTranslation 方法使用標識符獲取所需的翻譯字符串。
緩解可能出現大型配置文件的一種方法是將其托管到內容分發網絡(Content Delivery Network,CDN)上。通過這種方式,應用程序可以根據用戶的本地語言只加載必要的配置文件。這樣既能保證應用程序的運行速度,又能減少用戶不必要下載的數據量。當用戶切換本地語言或探測到不同的本地語言時,可以根據需要從 CDN 獲取配置。這為大規模應用程序提供了速度和靈活性之間的最佳平衡。為了簡單起見,我們考慮使用基礎的 HTTP 庫來獲取配置文件。在這個 Java 樣例中,我們將使用虛構的 HttpUtil 庫:
import java.util.Map;
import org.json.JSONObject;
public class InternationalizationService {
private static final String CDN_BASE_URL = "https://cdn.example.com/locales/";
public String getTranslatedString(String key) {
String locale = getUserLocale();
String configContent = fetchConfigFromCDN(locale);
JSONObject configJson = new JSONObject(configContent);
return configJson.optString(key, "Translation not found");
}
private String fetchConfigFromCDN(String locale) {
String url = CDN_BASE_URL + locale + ".json";
return HttpUtil.get(url); // Assuming this method fetches content from a given URL
}
private String getUserLocale() {
// Implement method to get the user's locale
// This can be fetched from user preferences, system settings, etc.
return "en"; // Defaulting to English for this example
}
}
復制代碼
注意:上述代碼只是一個簡化的樣例,在實際的場景中可能需要錯誤處理、緩存機制和其他優化。
這里的想法是根據用戶的本地語言直接從 CDN 獲取必要的配置文件。用戶的本地語言決定了配置文件的 URL,獲取到之后,就會對配置文件進行解析,以獲得所需的翻譯。如果找不到相應地鍵,就會返回默認信息。這種方法的好處是,應用程序只需加載必要的翻譯,從而確保了最佳性能。
但是,要解決這些缺點,我們可以采取如下措施:第一個缺點可以通過在 CDN 上存儲配置文件并在需要時加載來緩解。第二個缺點可以通過在靜態字符串中使用占位符并在運行時根據上下文替換來解決。第三個缺點則需要一個健壯的錯誤處理機制和一些潛在的后備策略。
如果要翻譯的字符串有一部分內容是動態的,那么就需要一種更靈活的解決方案。以 Facebook 為例,在 News Feed 中,我們會看到這里使用了自定義的字符串來表示每篇文章的“Likes”信息。比如,如果文章只有一個“Likes”信息,那么你可能會看到“John likes your post.”。如果有兩個“Likes”信息,那么你可能會看到“John and David like your post.”。如果有兩個以上的“Likes”信息,你可能會看到“John, David and 100 others like your post.”。在這種情況下,需要進行一些自定義。動詞“like”和“likes”是根據喜歡文章的人數來確定的。如何做到這一點呢?
考慮如下的樣例:“John, David and 100 other people recently reacted to your post.”,在這里“David”、“John”、“100”、“people”和“reacted”都是動態元素。
我們來分析一下:
實現此類動態內容的一種方法是在配置文件中使用占位符,并在運行時根據上下文替換它們。
如下是一個 Java 樣例:
配置文件(適用于英語)
{
oneUserAction: {0} {1} your post,
twoUserAction: {0} and {1} {2} your post,
multiUserAction: {0}, {1} and {2} other {3} recently {4} to your post,
people: people,
likeSingular: likes,
likePlural: like,
}
復制代碼
配置文件(適用于法語):
{
oneUserAction: {0} {1} votre publication,
twoUserAction: {0} et {1} {2} votre publication,
multiUserAction: {0}, {1} et {2} autres {3} ont récemment {4} à votre publication,
people: personnes,
likeSingular: aime,
likePlural: aiment,
}
復制代碼
Java 實現:
import java.util.Locale;
import java.util.ResourceBundle;
public class InternationalizationExample {
public static void main(String[] args) {
// Examples
System.out.println(createMessage("David", null, 1, new Locale("en", "US"))); // One user
System.out.println(createMessage("David", "John", 2, new Locale("en", "US"))); // Two users
System.out.println(createMessage("David", "John", 100, new Locale("en", "US"))); // Multiple users
// French examples
System.out.println(createMessage("David", null, 1, new Locale("fr", "FR"))); // One user
System.out.println(createMessage("David", "John", 2, new Locale("fr", "FR"))); // Two users
System.out.println(createMessage("David", "John", 100, new Locale("fr", "FR"))); // Multiple users
}
private static String createMessage(String user1, String user2, int count, Locale locale) {
// Load the appropriate resource bundle
ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", locale);
if (count == 0) {
return ""; // No likes received
} else if (count == 1) {
return String.format(
messages.getString("oneUserAction"),
user1,
messages.getString("likeSingular")
); // For one like, returns "David likes your post"
} else if (count == 2) {
return String.format(
messages.getString("twoUserAction"),
user1,
user2,
messages.getString("likePlural")
); // For two likes, returns "David and John like your post"
} else {
return String.format(
messages.getString("multiUserAction"),
user1,
user2,
count,
messages.getString("people"),
messages.getString("likePlural")
); // For more than two likes, returns "David, John and 100 other people like your post"
}
}
}
復制代碼
無論規模大小,開發有效的國際化(i18n)和本地化(l10n)框架對于軟件應用都至關重要。這種方法可以確保你的應用能夠與用戶的母語和文化背景產生共鳴。雖然字符串翻譯是 i18n 和 l10n 的一個重要組成部分,但它只是軟件全球化這一更廣泛挑戰的一個方面而已。
有效的本地化不僅僅是翻譯,還要解決其他的關鍵問題,例如書寫方向,阿拉伯語等語言的書寫方向(從右到左)和文本長度或大小各不相同,泰米爾語等語言的文字可能比英語更長。通過精心定制這些策略來滿足特定的本地化需求,你就可以為軟件提供真正全球化的、適用于不同文化的用戶體驗。
原文鏈接:構建國際化框架,Web開發讓語言無阻_框架_InfoQ精選文章
HTML被認為是前端知識體系中最簡單的知識,幾年前,很多人都推薦在W3C上學習個幾天就能夠基本掌握。
但隨著HTML5和移動端的強勢發展,HTML的技能點也越來越難。
HTML:Hyper Text Markup Language,超文本標記語言(用來描述網頁的一種語言)。
超文本(Hyper Text),指的是包含了指向其他文檔,也就是超鏈接的文檔。同時,不只包括文本,也可以包括圖片、鏈接、音樂、視頻等非文本元素。
標記語言(Markup Language),HTML不是編程語言,僅是一種標記語言,由一套標記標簽(語義化標簽)組成。
標記指計算機所能理解的信息符號。
青島中新(83837777.com)
*請認真填寫需求信息,我們會在24小時內與您取得聯系。