Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日韩福利片午夜在线观看,男女日比视频,亚洲欧洲日产国产最新

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          易語言簡單超文本框的使用方法

          單超文本框,默認(rèn)安裝的組件中是找不到的,需要使用擴(kuò)展支持庫才能使用這個組件。

          接下來我們說說“超文本”這個詞,簡單的說易語言簡單超文本框就是HTML中的<a>超鏈接。

          窗口預(yù)覽:

          我們先創(chuàng)建一個windows窗口程序,在窗口中繪制簡單超文本框組件

          在簡單超文本框中右鍵,選擇設(shè)置超文本菜單。然后編寫HTML<a>代碼:

          當(dāng)然也可以使用組件的屬性的賦值功能來設(shè)置超文本的內(nèi)容,這里的超文本為字節(jié)集,所有需要把文本轉(zhuǎn)換為字節(jié)集數(shù)據(jù),然后再賦值:

          當(dāng)然這樣的直接<a>字體會顯示藍(lán)色,我們也可以在“層疊樣式表CSS”中來設(shè)置字體的顏色:

          本期的介紹簡單超文本框就到這里。我們下期再見。

          者 | Hemanth Murali

          譯者 | 張衛(wèi)濱

          策劃 | Tina


          快速閱讀


          • 國際化(i18n)和本地化是 Web 開發(fā)中的關(guān)鍵流程,能夠確保軟件適用于不同的語言和地區(qū),并確保軟件實際適配這些特定的需求。
          • 盡管以 JavaScript 為核心的 i18n 庫(如 i18next、react-intl 和 react-i18next)是該領(lǐng)域的主流工具,可幫助開發(fā)人員高效地處理翻譯和本地化相關(guān)的配置,但它們僅適用于基于 JavaScript 的 Web 應(yīng)用。我們需要一個與語言無關(guān)的國際化框架。
          • JSON 是一種廣泛接受的格式,可用于存儲翻譯和本地化相關(guān)的配置,無論使用何種語言和框架,都能在各種應(yīng)用程序中輕松集成和動態(tài)替換內(nèi)容。
          • 內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network,CDN)可被戰(zhàn)略性地用于高效提供本地化相關(guān)的配置文件,從而減輕加載大型配置文件潛在的弊端。
          • 構(gòu)建自定義國際化框架,并將其與數(shù)據(jù)庫或數(shù)據(jù)存儲解決方案集成,可以實現(xiàn)動態(tài)和上下文感知的翻譯,從而增強(qiáng)不同地區(qū)和語言的用戶體驗。


          你是否已經(jīng)涉足 Web 開發(fā)的汪洋大海?如果答案是肯定的,那你很快就會意識到,Web 不僅僅是為英語使用者服務(wù)的,它是面向全球的。假設(shè)法國用戶看到了一條令人困惑的純英文錯誤信息,在你被類似的投訴淹沒之前,我們先來討論一下什么是國際化(internationalization,通常簡寫為 i18n)和本地化。


          i18n 這個流行詞是什么意思?


          想象一下,在這個世界上,無論每個人的母語是什么,你的軟件都可以與他們流暢地交流。這就是國際化和本地化要實現(xiàn)的目標(biāo)。雖然乍看上去沒啥特別之處,但是請記住,本地化應(yīng)用程序不僅僅是翻譯文本。而是要根據(jù)用戶的文化、地區(qū)和語言偏好提供量身定制的體驗。


          但是,這里有個障礙在等著你。深入了解 i18n 庫的工具箱,你會發(fā)現(xiàn)以 JavaScript 為核心的解決方案占據(jù)了主導(dǎo)地位,尤其是那些圍繞 React 的解決方案(如 i18next、react-intl 和 react-i18next )。


          如果跳出 JavaScript 的范疇,可選的方案就會越來越少。更糟糕的是,這些現(xiàn)成的工具通常都帶有“一刀切”的特點(diǎn),缺乏適配特定用例的能力。


          不過,不必?fù)?dān)心!如果鞋子不合適的話,為何不自己動手做呢?請繼續(xù)往下閱讀,我們將指導(dǎo)你從頭開始構(gòu)建一個國際化框架:一個為你的應(yīng)用程序量身定制、跨語言和跨框架的解決方案。


          準(zhǔn)備好為你的應(yīng)用程序簽發(fā)全球通行證了嗎?讓我們開始這段旅程吧。


          基礎(chǔ)的方式


          掌握國際化精髓的一個簡單方法就是使用一個函數(shù),該函數(shù)能夠根據(jù)用戶所在的地域獲取信息。如下是一個使用 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.
              }
          }

          復(fù)制代碼


          在上面的樣例中,getWelcomeMessage 根據(jù) locale 指定的語言返回歡迎信息。語言是由 getUserLocale 方法確定的。這種方法雖然非?;A(chǔ),但是展示了根據(jù)用戶特定的本地語言提供內(nèi)容的原則。但是,隨著內(nèi)容的進(jìn)展,我們將深入研究更先進(jìn)的技術(shù),并了解為何這種基礎(chǔ)的方式對于大型應(yīng)用程序可能無法具備可擴(kuò)展性和高效率。


          優(yōu)點(diǎn)


          • 覆蓋面廣:由于所有的翻譯都嵌入在代碼中,因此我們可以使用多種語言,而不必?fù)?dān)心外部依賴或缺失翻譯。
          • 無網(wǎng)絡(luò)調(diào)用:翻譯直接從代碼中獲取,無需任何網(wǎng)絡(luò)開銷或從外部源獲取翻譯相關(guān)的延遲。
          • 便利的代碼搜索:由于所有的翻譯都是源碼的一部分,因此搜索特定翻譯或排查相關(guān)的問題變得很簡單易行。
          • 可讀性:開發(fā)人員可以立即理解選擇特定翻譯背后的流程和邏輯,從而簡化調(diào)試和維護(hù)。
          • 減少外部依賴:無需依賴外部翻譯服務(wù)或數(shù)據(jù)庫,這意味著應(yīng)用程序中少了一個故障點(diǎn)。


          缺點(diǎn):


          • 更新操作需要發(fā)布新的版本:在移動應(yīng)用或獨(dú)立應(yīng)用的場景中,添加新語言或調(diào)整現(xiàn)有的翻譯需要用戶下載并更新最新版本的應(yīng)用。
          • 冗余代碼:隨著要支持語言數(shù)量的增加,switch 和條件語句也會相應(yīng)地增加,從而導(dǎo)致代碼的重復(fù)和臃腫。
          • 合并沖突:由于多個開發(fā)人員可能會對各種語言進(jìn)行添加或修改,所以版本控制系統(tǒng)中出現(xiàn)合并沖突的風(fēng)險會隨之增加。
          • 代碼維護(hù)所面臨的挑戰(zhàn):隨著時間的推移,應(yīng)用程序會進(jìn)行擴(kuò)展并支持更多的本地語言,直接在代碼中管理和更新翻譯會變得繁瑣且容易出錯。
          • 靈活性有限:采用這種靜態(tài)的方式很難添加像復(fù)數(shù)形式、特定上下文的翻譯或動態(tài)獲取翻譯等特性。
          • 性能開銷:對于大規(guī)模應(yīng)用而言,加載大塊的翻譯數(shù)據(jù)卻僅使用其中很小的一部分會導(dǎo)致資源緊張,造成效率低下。


          基于配置的國際化


          在前一種方法的基礎(chǔ)之上,我們努力保留其優(yōu)點(diǎn),同時解決其缺點(diǎn)。為了實現(xiàn)這一點(diǎn),我們將代碼庫中的硬編碼字符串值過渡到基于配置的設(shè)置。我們會為每種本地語言使用單獨(dú)的配置文件,并以 JSON 格式進(jìn)行編碼。這種模塊化方式簡化了翻譯的添加和修改,無需進(jìn)行代碼的變更。


          如下是英語和西班牙語本地語言的配置文件:


          文件名:en.json


          {    "welcome_message": "Hello, World"}
          
          

          復(fù)制代碼


          文件名:es.json


          {    "welcome_message": "Hola, Mundo"}
          
          

          復(fù)制代碼


          Java 中的實現(xiàn):


          首先,我們需要一種讀取 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";
              }
          }

          復(fù)制代碼


          Internationalization 類在實例化的時候,會根據(jù)提供的本地語言讀取上述代碼中相關(guān)的 JSON 配置。getTranslation 方法使用標(biāo)識符獲取所需的翻譯字符串。


          優(yōu)點(diǎn):


          • 保留了上述方式的所有優(yōu)點(diǎn):覆蓋面廣,加載后無需使用網(wǎng)絡(luò)就能進(jìn)行翻譯,代碼易于搜索和閱讀。
          • 動態(tài)加載:可根據(jù)用戶的本地語言動態(tài)加載翻譯。只需加載必要的翻譯,從而帶來潛在的性能優(yōu)勢。
          • 可擴(kuò)展性:添加新語言更容易。只需為該語言添加一個新的配置文件,應(yīng)用程序就能處理它,無需任何代碼修改。
          • 更整潔的代碼:邏輯與翻譯分離,代碼更簡潔、更易維護(hù)。
          • 中心化的管理:所有的翻譯都集中在一個文件中,因此更易于管理、審查和更新。這種方法提供了一種更可擴(kuò)展、更簡潔的國際化處理方式,尤其適用于大型應(yīng)用程序。

          缺點(diǎn):


          • 可能會導(dǎo)致配置文件過大:隨著應(yīng)用程序的增長和對多種語言的支持,這些配置文件可能會變得相當(dāng)大。這可能會導(dǎo)致應(yīng)用程序的初始加載出現(xiàn)滯后,尤其是在配置文件需要前期加載的情況中。


          從 CDN 抓取配置


          緩解可能出現(xiàn)大型配置文件的一種方法是將其托管到內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network,CDN)上。通過這種方式,應(yīng)用程序可以根據(jù)用戶的本地語言只加載必要的配置文件。這樣既能保證應(yīng)用程序的運(yùn)行速度,又能減少用戶不必要下載的數(shù)據(jù)量。當(dāng)用戶切換本地語言或探測到不同的本地語言時,可以根據(jù)需要從 CDN 獲取配置。這為大規(guī)模應(yīng)用程序提供了速度和靈活性之間的最佳平衡。為了簡單起見,我們考慮使用基礎(chǔ)的 HTTP 庫來獲取配置文件。在這個 Java 樣例中,我們將使用虛構(gòu)的 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
              }
          }

          復(fù)制代碼


          注意:上述代碼只是一個簡化的樣例,在實際的場景中可能需要錯誤處理、緩存機(jī)制和其他優(yōu)化。


          這里的想法是根據(jù)用戶的本地語言直接從 CDN 獲取必要的配置文件。用戶的本地語言決定了配置文件的 URL,獲取到之后,就會對配置文件進(jìn)行解析,以獲得所需的翻譯。如果找不到相應(yīng)地鍵,就會返回默認(rèn)信息。這種方法的好處是,應(yīng)用程序只需加載必要的翻譯,從而確保了最佳性能。


          優(yōu)點(diǎn)


          • 繼承了前一種方法的所有優(yōu)勢。
          • 易于為新的本地語言組織和添加翻譯。
          • 只需獲取必要的翻譯,因此加載效率高。


          缺點(diǎn):


          • 配置文件體積龐大,可能會降低應(yīng)用程序的初始化速度。
          • 字符串必須是靜態(tài)的。無法直接支持動態(tài)字符串或需要運(yùn)行時計算的字符串。如果需要在翻譯中插入動態(tài)數(shù)據(jù),這可能是一個限制。
          • 依賴外部服務(wù)(CDN)。如果 CDN 遇到故障或出現(xiàn)問題,應(yīng)用程序?qū)o法獲取翻譯內(nèi)容。


          但是,要解決這些缺點(diǎn),我們可以采取如下措施:第一個缺點(diǎn)可以通過在 CDN 上存儲配置文件并在需要時加載來緩解。第二個缺點(diǎn)可以通過在靜態(tài)字符串中使用占位符并在運(yùn)行時根據(jù)上下文替換來解決。第三個缺點(diǎn)則需要一個健壯的錯誤處理機(jī)制和一些潛在的后備策略。


          動態(tài)字符串處理


          如果要翻譯的字符串有一部分內(nèi)容是動態(tài)的,那么就需要一種更靈活的解決方案。以 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.”。在這種情況下,需要進(jìn)行一些自定義。動詞“l(fā)ike”和“l(fā)ikes”是根據(jù)喜歡文章的人數(shù)來確定的。如何做到這一點(diǎn)呢?


          考慮如下的樣例:“John, David and 100 other people recently reacted to your post.”,在這里“David”、“John”、“100”、“people”和“reacted”都是動態(tài)元素。


          我們來分析一下:


          • “David”和“John”可以是從與用戶相關(guān)的方法或數(shù)據(jù)庫中獲取的用戶名。
          • “100”可以是從與文章相關(guān)的方法或數(shù)據(jù)庫中獲取的對文章做出反應(yīng)的總?cè)藬?shù),其中不包括 David 和 John。
          • 當(dāng)代指一個集體時,“people”可以是名詞“人”的復(fù)數(shù)形式。
          • “reacted”可用于用戶以愛心、關(guān)注或憤怒等圖標(biāo)對文章做出反應(yīng),而不能是表示喜歡的圖標(biāo)。


          實現(xiàn)此類動態(tài)內(nèi)容的一種方法是在配置文件中使用占位符,并在運(yùn)行時根據(jù)上下文替換它們。


          如下是一個 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,
          }

          復(fù)制代碼


          配置文件(適用于法語):


          {
                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,
          }

          復(fù)制代碼


          Java 實現(xiàn):


          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"
                  }
              }
          }

          復(fù)制代碼


          結(jié)論


          無論規(guī)模大小,開發(fā)有效的國際化(i18n)和本地化(l10n)框架對于軟件應(yīng)用都至關(guān)重要。這種方法可以確保你的應(yīng)用能夠與用戶的母語和文化背景產(chǎn)生共鳴。雖然字符串翻譯是 i18n 和 l10n 的一個重要組成部分,但它只是軟件全球化這一更廣泛挑戰(zhàn)的一個方面而已。


          有效的本地化不僅僅是翻譯,還要解決其他的關(guān)鍵問題,例如書寫方向,阿拉伯語等語言的書寫方向(從右到左)和文本長度或大小各不相同,泰米爾語等語言的文字可能比英語更長。通過精心定制這些策略來滿足特定的本地化需求,你就可以為軟件提供真正全球化的、適用于不同文化的用戶體驗。

          原文鏈接:構(gòu)建國際化框架,Web開發(fā)讓語言無阻_框架_InfoQ精選文章

          TML簡介

          HTML被認(rèn)為是前端知識體系中最簡單的知識,幾年前,很多人都推薦在W3C上學(xué)習(xí)個幾天就能夠基本掌握。

          但隨著HTML5和移動端的強(qiáng)勢發(fā)展,HTML的技能點(diǎn)也越來越難。

          HTML:Hyper Text Markup Language,超文本標(biāo)記語言(用來描述網(wǎng)頁的一種語言)。

          超文本(Hyper Text),指的是包含了指向其他文檔,也就是超鏈接的文檔。同時,不只包括文本,也可以包括圖片、鏈接、音樂、視頻等非文本元素。

          標(biāo)記語言(Markup Language),HTML不是編程語言,僅是一種標(biāo)記語言,由一套標(biāo)記標(biāo)簽(語義化標(biāo)簽)組成。

          標(biāo)記指計算機(jī)所能理解的信息符號。

          青島中新(83837777.com)


          主站蜘蛛池模板: 日本丰满少妇一区二区三区 | 波多野结衣一区二区三区aV高清| 日韩AV无码一区二区三区不卡 | 亚洲国产精品一区二区三区在线观看| 国产未成女一区二区三区| 综合久久一区二区三区| 午夜视频一区二区三区| 午夜天堂一区人妻| 国产一区二区免费视频| 无码人妻一区二区三区免费视频 | 国产亚洲欧洲Aⅴ综合一区| 午夜影院一区二区| 日韩精品视频一区二区三区| 日本高清无卡码一区二区久久| 中文字幕av人妻少妇一区二区| 国产成人久久精品一区二区三区| 无码AV一区二区三区无码| 精品久久久久久无码中文字幕一区| 国产精品一级香蕉一区| 日韩精品无码一区二区中文字幕 | 国精产品一区二区三区糖心| 国产婷婷色一区二区三区深爱网| 呦系列视频一区二区三区| 国产精品无圣光一区二区| 国产一区二区三区精品视频| 国精产品一区二区三区糖心| 国产成人无码AV一区二区在线观看| 国产在线精品一区二区夜色 | 国产无吗一区二区三区在线欢| 亚洲一区二区三区写真| 深田咏美AV一区二区三区| 亚洲.国产.欧美一区二区三区 | 亚洲熟女乱色一区二区三区| 中文字幕一区二区三匹| 国产伦精品一区二区三区女| 综合无码一区二区三区四区五区| 国产精品高清视亚洲一区二区| 国模无码视频一区二区三区| 国产天堂在线一区二区三区| 久久se精品一区精品二区国产| 中文字幕精品亚洲无线码一区|