unity的多语言配置工具

demo下载:https://github.com/JSumC/LanguageExcel

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
using UnityEngine;
using UnityEngine.UI;
namespace LanguageExcel
{
    public class LETool : MonoBehaviour
    {
        public static language Language=language.CN; 
        [Header("表格文件夹")]
        public static string URL =  Application.streamingAssetsPath;

        public static string ExcelName = "LE";
        private static bool m_loaded;
        public static event Action OnLangaugeChanged ;


    
        public  class plot
        {
            public string IN,CN,EN,JP,FR,DE,ID,TH,TW;
        }
        public enum  language
        {
           IN, CN,EN,JP,FR,DE,ID,TH,TW
        }

        public static List<plot> S_Plots= new List<plot>();
        public virtual void OnEnable()
        {
            initialization();
        }

        public void initialization()
        {
            if (!m_loaded)
            {
                LoadExcel();
                m_loaded = true;
            } 

        }

        void LoadExcel()
        {
            foreach (var VARIABLE in ReadFile())
            {
                FileInfo fileInfo = new FileInfo(VARIABLE);
                if (VARIABLE.Contains(ExcelName))
                {
                    using (ExcelPackage excelPackage = new ExcelPackage(fileInfo))
                    {
                        ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[1];

                        for (int Left = 2; Left < worksheet.Dimension.End.Row + 1; Left++) //根据行数遍历
                        {
                        
                            if (worksheet.Cells[Left, 1].Value.ToString().Length>0)
                            {
                                plot Plot = new plot();
                                Plot.IN= worksheet.Cells[Left, 1]?.Value?.ToString();
                                Plot.CN= worksheet.Cells[Left, 2]?.Value?.ToString();
                                Plot.EN= worksheet.Cells[Left, 3]?.Value?.ToString();
                                Plot.JP= worksheet.Cells[Left, 4]?.Value?.ToString();
                                Plot.FR= worksheet.Cells[Left, 5]?.Value?.ToString();
                                Plot.DE = worksheet.Cells[Left, 6]?.Value?.ToString();
                                Plot.ID = worksheet.Cells[Left, 7]?.Value?.ToString();
                                Plot.TH = worksheet.Cells[Left, 8]?.Value?.ToString();
                                Plot.TW = worksheet.Cells[Left, 9]?.Value?.ToString();
                                S_Plots.Add(Plot);
                            }

                        
               
                  
                        }
                    }


                }
            }

        }
        static List<string> ReadFile()
        {
            List<string> files = GetFiles(URL, "*.xlsx");


            List<string> GetFiles(string directory, string pattern)
            {
                List<string> files = new List<string>();
                foreach (var item in Directory.GetFiles(directory, pattern))
                {
                    files.Add(item);
                }

                foreach (var item in Directory.GetDirectories(directory))
                {
                    files.AddRange(GetFiles(item, pattern));
                }

                return files;
            }

            return files;
        }

        public static string Get(string t)
        {
            plot selectedPlot = S_Plots.FirstOrDefault(p => p.IN == t);
            string languageField = Language.ToString(); 
            string plotString = (string)selectedPlot.GetType().GetField(languageField).GetValue(selectedPlot);
            return plotString;
        }

        /// <summary>
        /// 切换到指定语言
        /// </summary>
        /// <param name="t"></param>
        public static void SetLanguage(language t)
        {
            if (t!=Language)
            {
                Language = t;
                OnLangaugeChanged?.Invoke();
            }

        }
/// <summary>
/// 切换到下个语言
/// </summary>
        public static void SetLanguage()
        {
            int currentLanguageIndex = (int)Language;
            int totalLanguages = Enum.GetValues(typeof(language)).Length;
            int nextLanguageIndex = (currentLanguageIndex + 1) % totalLanguages;
            Language = (language)nextLanguageIndex;
            OnLangaugeChanged?.Invoke();
        }

public static void SetText(Text t, string str)
{
    t.text = Get(str);
}
    }
}

效果图:

测试用代码:

using System;
using System.Collections;
using System.Collections.Generic;
using LanguageExcel;
using UnityEngine;
using UnityEngine.UI;

public class Demo : MonoBehaviour
{
   public Button ChangeLanguageBTN;
   public Button ChangeStringBTN;
   public Text ShowText;
   public static string Targetstr="你好";//目标字符串
   private void OnEnable()
   {
      LETool.SetText(ShowText, Targetstr);
      LETool.OnLangaugeChanged += ()=>LETool.SetText(ShowText, Targetstr);
      ChangeLanguageBTN.onClick.AddListener(() =>
      {
         LETool.SetLanguage();
      });
      ChangeStringBTN.onClick.AddListener(() =>
      {
         Targetstr = Targetstr == "你好" ? "再见" : "你好";
         LETool.SetText(ShowText, Targetstr);
      });
   }
   
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/199838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cpu飙升问题排查以及解决

1、查看内存占用排行 top -c 2、查看服务器内存使用情况 free -h 3、查看文件夹磁盘空间大小 Linux 查看各文件夹大小命令du -h --max-depth1 (1)查看文件目录一级目录磁盘空间 du -h --max-depth1 (2&#xff09;查看指定文件目录 du sh home --max-depth2 4、Linux下…

苹果手机怎么卸载微信?记得掌握这两种方法!

微信是一款社交应用程序&#xff0c;在聊天过程中&#xff0c;我们会经常发送和接收各种形式的信息。随着时间的推移&#xff0c;微信缓存的文件会越来越多&#xff0c;占用的存储空间也会逐渐增加。 卸载微信可以释放手机内存&#xff0c;提高手机的运行速度。那么&#xff0…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分&#xff0c;每天都要与之互动。 精通Git不仅能简化你的日常操作&#xff0c;还能显著提高生产力。在这篇文章中&#xff0c;我们将探讨一组能够极大提升生产力的命令。 随着对…

运维笔记111

运维笔记 Navicat中查询指定字段名所在的表名tomcat设置JVM的初始堆内存修改catalina.sh文件修改完保存并关闭tomcat启动tomcat 查询数据库连接数查询是否存在死锁 Navicat中查询指定字段名所在的表名 SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME‘替换成你要…

基于加拿大降水分析 (CaPA) 系统的北美区域确定性降水数据集

区域确定性降水分析 (RDPA) 基于加拿大降水分析 (CaPA) 系统的区域确定性降水分析 (RDPA) 的域与业务区域模式相对应&#xff0c;即区域确定性预报系统 (RDPS-LAM3D)&#xff0c;但太平洋地区除外其中 RDPA 域的西边边界相对于区域模型域稍微向东移动。RDPA 分析的分辨率与运行…

宋仕强论道之华强北的商业配套(十三)

宋仕强论道之华强北的商业配套&#xff08;十三&#xff09;&#xff1a;金航标电子萨科微半导体总经理宋仕强先生发布“宋仕强论道”系列视频&#xff0c;分享多年学习、生活和工作经验和感悟&#xff0c;甚至涵盖了文学、艺术、哲学、宗教。这段时间发表的是对华强北&#xf…

如何与LEONI建立EDI连接?

莱尼LEONI是一家为汽车及其他行业提供能源数据管理产品、解决方案及服务的全球供应商。供应链范围从研发生产标准化电缆、特种电缆和数据电缆到高度复杂的布线系统和相关组件。本文将介绍如何与莱尼LEONI建立EDI连接。 什么是EDI&#xff1f; EDI全称Electronic Data Interch…

LeetCode.24两两交换链表中的节点

LeetCode.24两两交换链表中的节点 1.问题描述2.解题思路3.代码 1.问题描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示…

孩子写作业用的护眼灯哪种好?适合考研的护眼台灯推荐

随着现在小孩子的近视率越来越高&#xff0c;全国中小学生近视比率占大多数&#xff0c;许多家长也开始为孩子的健康成长而担忧&#xff0c;这时很多家长就会选择护眼台灯来为孩子保驾护航。但面对市面上五花八门的台灯品牌&#xff0c;各式各样的台灯许多家长却乱了阵脚&#…

vue elementUI 自定义框组织树,选择select下拉组织树横行滑动条出现方法

背景&#xff1a;最近公司开发需要使用到组织树进行组织结构的选择&#xff0c;在开发途中遇到两个次组织树已超过外框&#xff0c;但超出部分不显示横向滑动条。 自定义组织树框代码如下&#xff1a; <el-row><el-col :span"20" style"padding: 0px…

【前端】three.js

文章目录 概述three.js-master目录结构Threejs 的基本要素场景相机透视相机正交相机 网格2d3d 灯光AmbientLight(环境光)平行光&#xff08;DirectionalLight&#xff09;点光源&#xff08;PointLight&#xff09;聚光灯&#xff08;SpotLight&#xff09; 渲染器 Threejs 的实…

Scrum敏捷开发流程及支撑工具

Scrum是一种敏捷开发框架&#xff0c;用于管理复杂的项目。以下这些步骤构成了Scrum敏捷开发流程的核心。通过不断迭代、灵活应对变化和持续反馈&#xff0c;Scrum框架帮助团队快速交付高质量的产品。 以下是Scrum敏捷开发流程的基本步骤&#xff1a; 产品Backlog创建&#xf…

Python 图形用户界面详解(GUI,Tkinter)

文章目录 1 概述1.1 TK&#xff1a;窗口1.2 官方文档 2 组件2.1 Label&#xff1a;标签2.2 Button&#xff1a;按钮2.3 Entry&#xff1a;输入2.4 Text&#xff1a;文本2.5 Radiobutton&#xff1a;单选框2.6 Checkbutton&#xff1a;复选框2.7 Canvas&#xff1a;画布2.10 Men…

skywalking告警qq邮箱发送

首先开启发送接收qq邮箱的权限 开启之后&#xff0c;会让你发送信息&#xff0c;按着一系列操作&#xff0c;获得password &#xff08;授权码&#xff08;例如&#xff0c;qq开启SMTP授权码&#xff0c;qq授权码16位&#xff09;&#xff09; <!-- mail邮箱-->…

基于STM32单片机的智能家居系统设计(论文+源码)

1.系统设计 基于STM32单片机的智能家居系统设计与实现的具体任务&#xff1a; &#xff08;1&#xff09;可以实现风扇、窗帘、空调、灯光的开关控制&#xff1b; &#xff08;2&#xff09;具有语音识别功能&#xff0c;可以通过语音控制家电&#xff1b; &#xff08;3&a…

第二证券:机构密集调研消费电子、半导体产业链

据上海证券报记者核算&#xff0c;近一个月来&#xff0c;共有41家消费电子类公司和92家半导体公司&#xff08;核算标准&#xff1a;申万职业2021&#xff0c;下同&#xff09;发布出资者调研纪要。其间&#xff0c;有的公司款待了16个批次估计超200家安排&#xff0c;更有公司…

Java零基础——docker篇

1.【熟悉】docker简介 1.1 什么是docker Docker是一个开源项目&#xff0c;诞生于2013年初&#xff0c;最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会&#xff0c;遵从了Apache2.0协议&#xff0c;项目代码在GitHub上进…

Sectigo通配符证书

Sectigo通配符证书&#xff08;Wildcard SSL Certificate&#xff09;是一种特殊类型的SSL证书&#xff0c;它适用于一个主域名及其所有子域名。这意味着&#xff0c;只要子域名在主域名下&#xff0c;就可以使用同一张通配符证书进行加密保护。这为拥有多个子域名的网站提供了…

ICC2/innovus设置no 1x gap的方法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2设置no 1x的方法如下: 1) set_placement_spacing_label -name X -lib_cells {*} -side right set_placement_spacing_label -name Y -lib_cells {*} -side left 2) set_placement_spacing_rul…

【黑马甄选离线数仓day07_常见优化手段及核销主题域开发】

1.常见优化手段 1.1 分桶表基本介绍 分桶表: 分文件的, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终…