[Godot] C#讀取CSV表格創建雙層字典實現本地化

最近研究了一下本地化,給大家用簡單易懂的方式說明我是怎么實現的,使用CSV表格填寫翻譯,然后在Godot中讀取為字典

表格填寫

首先,我們表格可以按照下面這種格式填寫

idzhenjaruesdefr
apple蘋果appleリンゴяблокоmanzanaApfelpomme
banana香蕉bananaバナナбананplátanoBananebanane
orange橙子orangeオレンジапельсинnaranjaOrangeorange

大家看表格應該能明白,用第一列作為鍵,然后再用語言作為第二層的鍵,就能調用到對應語言的文本了,有一點需要注意,我們保存的時候,格式需要選擇為 CSV UTF-8(用逗號分隔)的格式

打開查看,我們可以看到是下面這種格式

有一點需要注意,當我們打開表格的時候是有保護的,這時候不能在這里面修改保存,關閉表格即可

導入表格

我們直接把表格拖入到Godot里面,你可能會注意到Godot報錯

Failed to open 'C:\Users\Administrator\Videos\Fruits.csv'.

我們在資源管理器進行移動,Godot中會自動創建一堆.translation格式的翻譯文件

我們需要在導入中設置為原樣導出,選擇后點擊重新導入即可

接下來,你會發現文件變成了X號的圖標,不要雙擊打開他,Godot會直接閃退,我們刪除這些創建出來的.translation文件就行

讀取代碼

首先,我們需要創建一個雙層字典用來保存翻譯文本

using Godot.Collections;        //注意,使用字典就需要寫這個[Export]    //暴露在編輯器中
public Dictionary<string, Dictionary<string, string>> language = new Dictionary<string, Dictionary<string, string>>();private string csv_language_path = "res://Language/Fruits.csv";    //文件路徑
public string Now_Language = "zh";    //當前語言

然后我們寫一個函數,在初始化的時候把數據寫入字典

void Load_CSV_Language(){if (!FileAccess.FileExists(csv_language_path))  //判斷文件是否存在{GD.Print($"{csv_language_path}文件不存在");return;}var file = FileAccess.Open(csv_language_path, FileAccess.ModeFlags.Read);var header = file.GetLine().Split(",");    //獲取語言頭while (!file.EofReached())      //循環,直到指向尾部{Dictionary<string, string> lang = new Dictionary<string, string>();     //創建內層字典var line = file.GetLine().Split(",");   //獲取行(鍵,語言,語言,語言)if (string.IsNullOrWhiteSpace(line[0])) continue;       //跳過空行,防止越界for (int i = 1; i < line.Length; i++){lang.Add(header[i], line[i]);}language.Add(line[0], lang);}file.Close();       //關閉文件流}

接下來,我們寫一個獲取對應文本的函數方法即可

public string Get_Language(string key)      //返回本地化語言{return language[key][Now_Language];}

單例加載

有一點,在C#中使用Godot的自動加載功能,我們需要額外寫一些代碼

我這里則是放在了樹的加載函數中,大家根據需要進行調整

public static LanguageManager Instance;public override void _EnterTree(){Instance = this;Load_CSV_Language();    //調用加載字典函數}public override void _ExitTree(){Instance = null;}

這樣,我們運行場景,就能看到場景的根節點下,多了一個節點

接下來,我們只需要在其他節點中獲取即可調用?Get_Language?方法了

public LanguageManager languageManager;public override void _Ready(){languageManager = GetTree().Root.GetNode<LanguageManager>("LanguageManager");}

切換語言

為了在切換語言的時候更改場景的文本,我們先把所有的設置文本的函數都放在一個函數中,大家可以參照我的示例進行修改

public void SetLanguage(){Get_Language();SetText();}public void Get_Language()      //獲取翻譯{name = languageManager.Get_Language($"{id}");}private void SetText()      //設置文本{T_name.Text = name;}

我們修改本地化腳本的?Now_Language?變量

private string _Now_Language = "zh";public string Now_Language{get => _Now_Language;set{_Now_Language = value;UpdateLanguage();    //修改值時調用}}

我們可以給腳本的節點加上分組,使用CallGroup方法調用函數

public void UpdateLanguage()    //切換語言{GetTree().CallGroup("Text", "SetLanguage");     //通知組,調用設置語言方法}

這里我創建的組叫“Text”,我們需要在Godot中把組分給節點(或者在腳本中使用AddToGroup方法也可以)

這樣,我們修改?Now_Language?變量,文本就會發生改變

結語

通過這種結構化的雙層字典方案,我們成功構建了一個動態可擴展的本地化系統。如果項目文本量巨大,我們可以進行異步加載來進行優化,大家可以根據自己的需要進行修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84979.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark 之 Subquery

各類 Subquery src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala /*** Evaluates to `true` if `values` are returned in `query`s result set.*/ case class InSubquery(values: Seq[Expression], query: ListQuery)extends Predicate with Une…

3.1.3_棧的鏈式存儲實現

知識總覽&#xff1a; 鏈棧定義&#xff1a; 頭插法建立單鏈表&#xff1a; 每次要插入一個元素的時候&#xff0c;總是把該元素插在頭節點之后的位置&#xff0c;如果規定只能在單鏈表的鏈頭一端進行操作即為進棧操作 每次刪除一個元素的時候&#xff0c;規定只能在單鏈表…

華為OD機試_2025 B卷_字符串重新排列(Python,100分)(附詳細解題思路)

題目描述 給定一個字符串s&#xff0c;s包括以空格分隔的若干個單詞&#xff0c;請對s進行如下處理后輸出&#xff1a; 1、單詞內部調整&#xff1a;對每個單詞字母重新按字典序排序 2、單詞間順序調整&#xff1a; 1&#xff09;統計每個單詞出現的次數&#xff0c;并按次數降…

http的緩存問題

一句話概括&#xff1a;瀏覽器請求資源的時候&#xff0c;會首先檢查本地是否有緩存&#xff0c;減少向服務器請求的次數 一、緩存類型&#xff1a; 1. 強緩存&#xff08;本地緩存&#xff09;&#xff1a;直接讀本地&#xff0c;不發請求 控制方式&#xff1a; ① Cache-C…

【網絡安全】SRC漏洞挖掘思路/手法分享

文章目錄 Tip1Tip2Tip3Tip4Tip5Tip6Tip7Tip8Tip9Tip10Tip11Tip12Tip13Tip14Tip15Tip16Tip17Tip18Tip19Tip20Tip21Tip22Tip23Tip24Tip25Tip26Tip27Tip28Tip29Tip30Tip1 “復制該主機所有 URL”:包含該主機上的所有接口等資源。 “復制此主機里的鏈接”:包括該主機加載的第三…

「Linux中Shell命令」Shell常見命令

知識點及案例解析 1. who 命令 功能:顯示當前登錄系統的用戶信息,包括用戶名、終端、登錄時間、IP等。 案例: who輸出示例: root tty1 2025-06-13 19:42 root pts/0 2025-06-13 19:45 (192.168.226.1)解析: 顯示兩個用戶登錄信息: 第一列(用…

StampedLock入門教程

文章目錄 一、理解“戳” (Stamp)二、為什么 StampedLock 能提高讀性能&#xff1f;秘密在于“樂觀讀”StampedLock性能對比性能對比結果圖 總結 StampedLock完整演示代碼對代碼的疑問之處問題一&#xff1a;為什么 demonstrateOptimisticReadFailure 中寫線程能修改成功&#…

基于云計算的振動弦分析:諧波可視化與波動方程參數理解-AI云計算數值分析和代碼驗證

振動弦方程是一個基礎的偏微分方程&#xff0c;它描述了彈性弦的橫向振動。其應用范圍廣泛&#xff0c;不僅可用于模擬樂器和一般的波動現象&#xff0c;更是數學物理以及深奧的弦理論中的重要基石。 ??AI云計算數值分析和代碼驗證 振動弦方程是描述固定兩端彈性弦橫向振動的…

Qt .pro配置gcc相關命令(三):-W1、-L、-rpath和-rpath-link

目錄 1.Linux 動態庫相關知識 1.1.動態庫查找路徑 1.2.查看程序依賴的動態庫 1.3.修改動態庫查找路徑的方法 1.4.動態鏈接器緩存管理 2.-Wl參數 3.-L選項&#xff08;編譯時路徑&#xff09; 4.-rpath參數(運行時路徑) 5.-rpath-link 參數 6.常見問題與解決方案 7.總…

Hoppscotch

官方地址 xixiaxiazxiaxix下載 ? Hoppscotch Hoppscotch 是一款輕量級、基于 Web 的 API 開發套件&#xff0c;其核心功能和特點如下&#xff1a; 核心功能3 交互式 API 測試&#xff1a;允許用戶實時發送請求并查看響應&#xff0c;方便記錄 API 行為&#xff0c;在記錄響…

RabbitMQ 知識詳解(Java版)

RabbitMQ 知識詳解&#xff08;Java版&#xff09; RabbitMQ 是一個開源的消息代理&#xff0c;實現了高級消息隊列協議&#xff08;AMQP&#xff09;。它用于在分布式系統中實現應用解耦、異步通信和流量削峰。 核心概念 生產者(Producer)&#xff1a;發送消息的應用消費者(…

Flink task、Operator 和 UDF 之間的關系

要真正駕馭 Flink 并構建出高效、穩定、可擴展的流處理應用&#xff0c;僅僅停留在 API 的表面使用是遠遠不夠的。深入理解其內部的運行機制&#xff0c;洞悉數據從代碼到分布式執行的完整生命周期&#xff0c;以及明晰各個核心組件之間錯綜復雜而又協同工作的關系&#xff0c;…

Veeam Backup Replication系統的安裝與使用

Veeam Backup & Replication系統安裝與使用 系統簡介 核心功能 備份與恢復&#xff1a;專注于虛擬化環境&#xff08;如VMware和Hyper-V&#xff09;的備份與恢復&#xff0c;支持物理服務器和云環境。快速恢復&#xff1a;提供即時恢復功能&#xff0c;可在幾分鐘內恢復…

十四、【ESP32全棧開發指南:搭建輕量級HTTP服務器】

一、HTTP協議基礎 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;作為互聯網基礎協議&#xff0c;采用請求-響應模型工作&#xff1a; 1.1 HTTP請求組成 GET /uri?query1value1 HTTP/1.1 // 請求行&#xff08;方法URI協議版本&#xff09; Host: example…

java中LinkedList和ArrayList的區別和聯系?

我們被要求解釋Java中LinkedList和ArrayList的區別和聯系。下面將分別從實現原理、性能特點、使用場景等方面進行詳細說明&#xff0c;并總結它們的相同點和不同點。 # 一、聯系&#xff08;共同點&#xff09; 1. 都實現了List接口&#xff0c;因此具有List接口的所有方法&…

明遠智睿SD2351核心板:邊緣計算時代的工業級核心引擎深度解析

在工業4.0與物聯網深度融合的背景下&#xff0c;邊緣計算設備正從單一功能模塊向高集成度、智能化平臺演進。明遠智睿推出的SD2351核心板&#xff0c;憑借其異構計算架構、工業級接口資源和全棧技術生態&#xff0c;重新定義了邊緣計算設備的性能邊界。本文將從技術架構、場景適…

Flask 動態模塊注冊

目錄 1. 項目概述2. 項目結構3. 核心組件解析3.1 動態模塊注冊系統 (api/__init__.py)3.2 應用程序入口 (setup_demo.py) 4. 模塊開發指南4.1 標準模塊 (*_app.py)4.2 SDK模塊 (sdk/*.py) 5. URL路徑規則6. 如何使用6.1 啟動應用6.2 添加新模塊 7. 工作原理 1. 項目概述 這個項…

JVM 內存、JMM內存與集群機器節點內存的聯系

目錄 1、JVM 內存 1.1、分配機制 1.2、jvm模型位置 1.3、字節碼內存塊 2、JMM內存 2.1、JMM模型 2.2、工作流程圖 1、工作內存與主內存的交互 2. 多線程下的主內存與堆內存交互 2.3、 主內存與工作內存的同步方案 1、volatile 2、synchronized 3、final 3、內存使…

學習昇騰開發的第一天--環境配置

1、昇騰社區官網&#xff1a;昇騰社區官網-昇騰萬里 讓智能無所不及 2、產品-->選擇開發者套件-->點擊制卡工具的下載&#xff1a;資源-Atlas 200I DK A2-昇騰社區 3、如果制卡工具不能使用在線制卡&#xff0c;可以下載鏡像到本地使用本地制卡&#xff1a;Linux系統制…

Android WebView 深色模式適配方案總結

Android WebView 深色模式適配方案總結 在 Android WebView 中適配深色模式&#xff08;Dark Mode&#xff09;是一個常見的需求&#xff0c;尤其是當加載的網頁沒有原生支持 prefers-color-scheme 時。本文將介紹 3 種主流方案&#xff0c;并分析它們的優缺點&#xff0c;幫助…