硬汉嵌入式论坛

 找回密码
 立即注册
查看: 11030|回复: 26
收起左侧

[emWin] 多语言显示的方法

  [复制链接]

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
发表于 2019-7-4 00:59:12 | 显示全部楼层 |阅读模式
1.[EMWIN] 多国语言实现方法---csv文件实现
这个可以看这个博客
https://blog.csdn.net/ewrest/article/details/78346882



2.采用 allyzc  网友做的 一个很好的字库生成软件
新建位图图像.bmp
生成我们用的字库。
最新的字库软件可以在这个帖子下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=87428&extra=&page=1

将生成的文件添加到工程中
新建位图图像 (2).bmp


附主要代码
/*
*********************************************************************************************************
*                                   
* 模块名称 : GUI界面主函数
* 文件名称 : MainTask.c
* 版    本 : V1.0
* 说    明 : 本实验主要学习emWin的多语言文本显示
*              
* 修改记录 :
*  版本号   日期         作者          说明
*  V1.0    2016-07-16   Eric2013       首版   
*  V1.1    2019-07-04  雷鹏      添加多语言支持                                      
* Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "MainTask.h"
#include "stdint.h"

/*定义多语言宏 */
enum
{
  ENGLISH=0, /*英文*/
  CHINESE,   /*中文*/
  JAPANESE,  /*日文*/
  TURKISH,   /*土耳其语*/
/* 其他小语种没有做
   GERMAN,  //德语
   PORTUGUESE ,//葡萄牙语
   ITALIAN ,//意大利语
   SLOVENIAN, //斯洛语
*/
  LANG_NUM
};
  

///********语言值************/
const char* s_LangValue[LANG_NUM] =
{
  "ENGLISH",
  "简体中文",
  "私たち",
  "TÜRKÇE",
   //  "PORTUGUES", 葡萄牙
   //  "Slovensko", 斯洛文
};

/*外部字库定义*/
extern GUI_CONST_STORAGE GUI_FONT myFont_Engish;   /*英语*/
extern GUI_CONST_STORAGE GUI_FONT myFont_Chinese;  /*简体中文*/
extern GUI_CONST_STORAGE GUI_FONT myFont_Japanese; /*日本语*/
extern GUI_CONST_STORAGE GUI_FONT myFont_Turkish;  /*土耳其语*/

/*将所有字库组合到一个 数组里面 方便程序调用*/
GUI_CONST_STORAGE GUI_FONT *FontWm[]=
{
  &myFont_Turkish,
  &myFont_Chinese,
  &myFont_Japanese,
  &myFont_Turkish,
};


/*
*********************************************************************************************************
* 函 数 名: MainTask
* 功能说明: GUI主函数
* 形    参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{

uint8_t i;

/* 初始化 */
GUI_Init();

/*
  关于多缓冲和窗口内存设备的设置说明
    1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
    WM_MULTIBUF_Enable(1);
    2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
    3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
    STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
    感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
    4. 所有emWin例子默认是开启三缓冲。
*/
WM_MULTIBUF_Enable(1);

/*
       触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
    此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
*/
/* 设置文本显示模式 */
  GUI_SetTextMode(GUI_TM_TRANS);
GUI_SetBkColor   (GUI_BLUE);  /*设置背景色为蓝色*/
/* 要实现背景颜色的改变,必须的执行下面这句 */
GUI_Clear();

/* 使能UTF-8编码  必须要使能   */     
GUI_UC_SetEncodeUTF8();   
   
  GUI_SetColor(GUI_WHITE); /*设置文本颜色为白色*/
   
for(i=0;i<LANG_NUM;i++)
{
  GUI_SetFont(FontWm);   /*设置字体*/
  GUI_DispStringAt (s_LangValue,100, 100+50*i); /*显示内容*/
}

  
/*也可以这样调用  在实际项目中很实用 */
/*英文*/
GUI_SetFont(FontWm[ENGLISH]);   /*设置字体*/
GUI_DispStringAt (s_LangValue[ENGLISH] ,400, 100+50*ENGLISH); /*显示内容*/

  /*中文*/
GUI_SetFont(FontWm[CHINESE]);   /*设置字体*/
GUI_DispStringAt (s_LangValue[CHINESE] ,400, 100+50*CHINESE); /*显示内容*/

/*日文*/
GUI_SetFont(FontWm[JAPANESE]);   /*设置字体*/
GUI_DispStringAt (s_LangValue[JAPANESE],400, 100+50*JAPANESE); /*显示内容*/  

/*土耳其语*/
GUI_SetFont(FontWm[TURKISH]);   /*设置字体*/
GUI_DispStringAt (s_LangValue[TURKISH] ,400, 100+50*TURKISH); /*显示内容*/  
  
  
while(1)
{
  GUI_Delay(10);
}
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/


显示效果
微信图片_20190704004814.jpg
显示两行是为了 展示两种使用方法。
最后附上基于V6开发板的工程文件

在其他的开发板上也是一样的用法。




V6_STemWin实验_多国语言显示(RTOS).zip

13.98 MB, 下载次数: 716

评分

参与人数 2金币 +150 收起 理由
caicaptain2 + 50 很给力!
eric2013 + 100 赞一个!

查看全部评分

回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-7-4 08:41:22 | 显示全部楼层
不错,谢谢分享!
回复

使用道具 举报

7

主题

70

回帖

91

积分

初级会员

积分
91
发表于 2019-7-4 08:56:39 | 显示全部楼层
学习,感谢分享
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-7-4 09:27:18 | 显示全部楼层
非常感谢楼主分享,cool
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
发表于 2019-7-4 10:16:02 | 显示全部楼层
其实不用做多个字体文件,所有用到的文字都可以复制到输入栏 QQ截图20190704101247.png
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2019-7-4 10:21:32 | 显示全部楼层
allyzc 发表于 2019-7-4 10:16
其实不用做多个字体文件,所有用到的文字都可以复制到输入栏

如果要显示的文字不在选择的字体里面,这种方法就不行了吧
代码不规范,亲人两行泪!
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
发表于 2019-7-4 10:36:35 | 显示全部楼层
missfox 发表于 2019-7-4 10:21
如果要显示的文字不在选择的字体里面,这种方法就不行了吧

都说所有用到的文字都做进去,
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
 楼主| 发表于 2019-7-4 10:57:51 | 显示全部楼层
allyzc 发表于 2019-7-4 10:16
其实不用做多个字体文件,所有用到的文字都可以复制到输入栏

666  那做多语言就很简单了
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2019-7-4 11:11:41 | 显示全部楼层
allyzc 发表于 2019-7-4 10:36
都说所有用到的文字都做进去,

比如我选择这个字体,里面就前面这几种字符,显然没法显示的。
QQ截图20190704110920.jpg
代码不规范,亲人两行泪!
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
发表于 2019-7-4 11:25:53 | 显示全部楼层
missfox 发表于 2019-7-4 11:11
比如我选择这个字体,里面就前面这几种字符,显然没法显示的。

这种只有英文的字体那就没办法了,只能单独做这种字体单独设置
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2019-7-4 12:27:09 | 显示全部楼层
学习了,谢谢分享
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
 楼主| 发表于 2019-7-4 19:09:52 | 显示全部楼层
又折腾一天 总于做出了多语言选择界面。

微信图片_20190704190021.jpg

微信图片_20190704190007.jpg

把所有的字符都弄到一个文件里面生成统一字库很好调用。
要显示的字符

英文
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  
简体中文
开机画面
西班牙文
AaBbCc&Ccedil;&ccedil;DdEeFfGg&#286;&#287;HhI&#305;&#304;iJjKkLlMmNnOo&Ouml;&oumlpRrSs&#350;&#351;TtUu&Uuml;üVvYyZz
德语
葡萄牙语
斯洛语
AaBbCc &#268; &#269; D d E e F f G g H h I i J j K k L l M m N n
OoPpQq R r S s &#352; &#353; T t U u V v W w X x Y y Z z &#381; &#382;


这样定义要使用的语言值

/*定义多语言宏 */
enum
{
  ENGLISH=0, /*英文*/
  CHINESE,   /*中文*/
  TURKISH,   /*土耳其语*/
  PORTUGUESE ,//葡萄牙语
  SLOVENIAN, //斯洛语
  LANG_NUM
};
  



///********语言值************/
const char* s_LangValue[LANG_NUM] =
{
  "English",   /*英语*/
  "简体中文",  /*中文*/
  "T&Uuml;RK&Ccedil;E",    /*土耳其*/
  "Deutsch",   /*德语*/
  "ortugues", /*葡萄牙*/
  "Slovensko", /*斯洛文 */
};




/*显示 语言下拉框 */
hItem = WM_GetDialogItem(pMsg->hWin, ID_DROPDOWN_LANG);
DROPDOWN_SetFont(hItem,GUI_SysFont24);
if(LangSel<LANG_NUM)
{
  for(LangSel=0;LangSel<LANG_NUM;LangSel++)
   DROPDOWN_AddString(hItem, s_LangValue[LangSel]);
  /* 下面这个三个函数是新增的 */
  DROPDOWN_SetAutoScroll(hItem, 1);
  DROPDOWN_SetListHeight(hItem, 200);
DROPDOWN_SetScrollbarWidth(hItem, 30);  /*设置滚动条宽度*/
}
DROPDOWN_SetSel (hItem, g_tParamSys.Language);  





回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-3-10 22:20:57 | 显示全部楼层
楼主你好,为什么我用你的方法汉字显示不出来了,只有英语?直接复制你的代码也没用
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-3-11 08:47:49 | 显示全部楼层
尘世那么美 发表于 2020-3-10 22:20
楼主你好,为什么我用你的方法汉字显示不出来了,只有英语?直接复制你的代码也没用

文件的编码格式要改一下。再详细看一遍安富莱显示中文的教程。
Releasing your creativity
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-3-11 11:28:31 | 显示全部楼层
廷润 发表于 2020-3-11 08:47
文件的编码格式要改一下。再详细看一遍安富莱显示中文的教程。

好的  谢谢
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
发表于 2020-3-11 20:30:44 | 显示全部楼层
感谢分享~
感觉多国语言切换的难点应该不是这个,应该是文字显示的位置和长度,这个很麻烦,比如中文显示四个字就够了,但是换成英文可能有20个字符,本来很合适的布局就出现字符溢出等显示问题了。调整起来也非常费劲,不知道有什么好的办法。
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
 楼主| 发表于 2020-3-11 22:25:23 | 显示全部楼层
尘世那么美 发表于 2020-3-10 22:20
楼主你好,为什么我用你的方法汉字显示不出来了,只有英语?直接复制你的代码也没用

C源程序要另存为 UTF-8 格式
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
 楼主| 发表于 2020-3-11 22:25:26 | 显示全部楼层
尘世那么美 发表于 2020-3-10 22:20
楼主你好,为什么我用你的方法汉字显示不出来了,只有英语?直接复制你的代码也没用

C源程序要另存为 UTF-8 格式
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
 楼主| 发表于 2020-3-11 22:32:06 | 显示全部楼层
kokoromi 发表于 2020-3-11 20:30
感谢分享~
感觉多国语言切换的难点应该不是这个,应该是文字显示的位置和长度,这个很麻烦,比如中文显示 ...

英文可以考虑用简写缩写     或者单独把英文字体调小一点
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-3-14 10:17:35 | 显示全部楼层
kokoromi 发表于 2020-3-11 20:30
感谢分享~
感觉多国语言切换的难点应该不是这个,应该是文字显示的位置和长度,这个很麻烦,比如中文显示 ...

中文是简体中文。外文表达也有很多缩写的常用语。例如尽快,很多老外都会直接发 ASAP,Please直接写Pls.

平时加国外客户的语言,直接google做是能力范围的事,但是我坚决say no。把字串发给业务,让他转发给客户翻译。

客户发回来的字串经常也会有爆格的现象,还是以客户为主,优先把客户翻译的搞出来,然后发效果图片给客户,让客户继续优化。这个没有更好的办法,找专业翻译机构,报价很贵。自己琢磨搞,English还好,想法语、德语、俄语、阿拉伯语等等就没底了。

我的建议是以客户需求为中心。自己可以做小改动,小优化。
Releasing your creativity
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
 楼主| 发表于 2020-5-18 11:17:51 | 显示全部楼层
廷润 发表于 2020-3-14 10:17
中文是简体中文。外文表达也有很多缩写的常用语。例如尽快,很多老外都会直接发 ASAP,Please直接写Pls.
...

是的  一切都要以客户为中心 ,尽可能满足客户需求。
客户虐我千百遍  我待客户入初恋。
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-8-31 21:44:36 | 显示全部楼层
我使能了UTF8函数,文件都换成了UTF-8的编码,用ucGUI自带的软件制作Unicode波兰语字库 ,输入字符串的时候,只有英文能显示,其他特殊字符不显示,直接跳过了不显示,那个特殊字符'&#281;’在数组占了两个元素,0xc4和cx99该怎么让这些特殊字符显示显示,要自己写一个转换函数吗?
回复

使用道具 举报

14

主题

37

回帖

79

积分

初级会员

积分
79
发表于 2021-1-21 17:01:54 | 显示全部楼层
用了GUI_UC_SetEncodeUTF8();,再使用GUI_SetFont(&GUI_FontHZ16);无法显示中文。
多国语言切换可以显示,但是如果读取SD卡文件,文件中有中文,需要载入GBK字库才能正常显示中文文件。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2021-2-23 09:13:38 | 显示全部楼层
我用这种方法做 阿拉伯语 和 泰语 发现阿拉伯语显示不了,泰语显示不全,有懂的吗?
回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2021-2-23 10:51:11 | 显示全部楼层
hbutluoxi 发表于 2021-2-23 09:13
我用这种方法做 阿拉伯语 和 泰语 发现阿拉伯语显示不了,泰语显示不全,有懂的吗?

阿拉伯语是从右到左显示的,需要设置一下,具体哪个版本的emwin支持从右到左记不清了,估计v6.10以上应该可以
回复

使用道具 举报

8

主题

39

回帖

63

积分

初级会员

积分
63
发表于 2022-6-23 08:54:18 | 显示全部楼层
一个大大的赞
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-7-5 16:07:10 | 显示全部楼层
我这边试了下,在我的板子上没办法直接显示中文,还需要调用COM_gbk2utf8(_aWarnTab[2].pTextCN,utf8_buffer); 多一个国标码切换到bft的代码才能显示,为什么呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 06:20 , Processed in 0.397236 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表