1 维语等语种显示规则

1、维语是从右到左的顺序读和写的,排版规则遵循右对齐,刚好跟汉语习惯相反。
2、维语每个词的长短不一,一个词由多个不同的字母组合而成,两词之间用【空格】隔开,就像英语显示形式类似。
3、维语的标点符号同英语一样--采用半角符号(如汉语句号【。】,维语句号是【.】)。

事例如下:

正常显示图片

说明: 为了方便CP确认替换之后的维语翻译文本是否正确,我特意做了验证小工具:

文本验证

图片验证

工具说明:文本翻转、特殊字符处理、左右顺序这三个设置需要根据实际引起的显示表现来确定,CP在使用的时候根据实际情况进行设定。

2 常见字体和对照表

3 常见问题总结

在字符翻译完后,不管是UI图片还是程序,文本显示都有可能出现如下问题:

1、字母没有连接;
2、有些字母的连接形态不对(32个字母,一般有6种、4种、2种等形态,形态不对会导致连接错误);
3、字母连接顺序有错误;
4、字符没有右对齐;
5、文本太长显示不全;

4 常见问题事例和解决方案

根据UI图片和程序中的显示不同,对问题进行分类:

4.1 UI图片显示问题

UI图片显示问题,是指Photoshop等在处理带有文字的图片的维语字符显示问题。

UI图片的翻译文本替换主要分一下几个步骤:

1、Photoshop安装【ALKATIP Basma.ttf】字体;
2、文本粘贴和复制;
3、字符位置调整;
4、出图;
5、校验;
6、放入程序显示;
7、最终显示校验;

注意: Photoshop得先安装 ALKATIP Basma Tom.ttf 字体

说明:

正常显示用 ALKATIP Basma Tom.ttf 字体

宣传图和Logo需等要用到艺术字体的场景从 艺术字体 中选择一个合适的即可。

4.1.1 单个词字母之间没有连接,词与词之间没有留空格

错误显示如下图:

错误显示图片

正确显示如下图:

正确显示图片

  • 解决方法:

替换成 ALKATIP Basma Tom.ttf 字体

Photoshop中的具体操作步骤如下:

编辑>首选项>文字>中东和南亚

如果字体还是没有变化,就把原本图层删掉再重新新建文字图层试试。如果依旧不行,重启PS,再新建图层。

4.1.2 有些有些字母的连接形态不对

  • 解决方法:

替换成 ALKATIP Basma Tom.ttf 字体

4.1.3 句子中包含数字和英文字,句子前后顺序正确位置被调乱。尤其是句首数字和英文字时。

如下图:

错误显示图片

  • 解决方法 这种问题通常都是全部复制翻译文本直接粘贴造成的,将普通文本和数字或字符分开,并分别复制到显示区域,再单独放置合成完整的一整句或者一段话。

4.1.4 文字没有右对齐或中对齐

错误如下图:

错误显示图片

正确显示如下图:

正确显示图片

  • 解决方法:

遵循维语显示规则,右对齐,但是特殊位置特殊处理,例如居中显示的文本,还是居中显示。

4.1.5 因维文太长重叠,显示不全

如下图:

错误显示图片

  • 解决方法:

请及时跟对方校对人员联系,根据用法替换成简短翻译语句,或缩小字体。

注意 UI图片文字替换完后,不要直接给程序。

应先给校对人员,校对完并确认没有问题后再给程序,这样可避免返工,减少替换资源时间。

4.1.5 字间距问题

默认情况下, ALKATIP Basam TomPhotoShop 中的字间距为-50, 此时字间距视觉效果不明显,表现是连接在一起的,所以需要把字间距设置为0 视觉效果才会表现正常,下图给出了一个字间距设置对比的效果图.

字间距设置对比效果图

注意, 示例图 PhotoShop 版本为 Adobe PhotoShop CC 2017.0.0 版

4.2 程序文本显示问题

程序中的翻译文本替换主要分一下几个步骤:

1、调整页面布局(主要是左右更换位置);
2、文本粘贴和复制;
3、字符转换;
4、特殊字符处理;
5、过长字符或布局调整;
6、校验和微调;

根据游戏客户端使用的引擎不同,处理方式分为如下两类:

4.2.1 Unity3D

主要步骤:

1、翻译文本替换;
2、通过 https://github.com/Alimjan2009/uyghur_convert_util 工具中的UyBaseAndEx.toEx函数做字符转换;
3、字符反转
4、特殊字母根据【维文字母UNICODE代码表】单独替换

注意 维文字母UNICODE代码表 的含义说明如下:

字母表说明图片

下面是一个用Text控件显示文本的具体事例:

  • 新建一个Unity工程

新建工程图片

  • 将翻译文本【ئۇيغۇرچە】放到Text控件中

错误显示图片

  • 字符转换

首先我们需要下维语转换工具 uyghur_convert_util这个工具是java的,用的时候根据需求翻译成自己需要的语言。

原始文字获取unity能正常显示的文字是分一下下两个步骤的:

1、用上面的工具的UyBaseAndEx.toEx函数把原始的文字(基本区)转换成unity可渲染的字形(扩展区)。  
(为什么要转换呢,维吾尔语里每一个unicode码代表的一个字母有两到四个不同的渲染字形,上面的工具是帮我们把我们需要渲染的字形给我们找出来了而已)。

2、对第一步得到的可显示字形(扩展区)进行反转,就是纯粹的字符串反转就行。  
(为什么要反转呢?第一步帮我们把逻辑字母转换成了可渲染的字形,而这些字形是需要从右到左拼接的,而unity默认是从左到右,所以反转一下就可以正常显示了)

Intellij idea里面的转换过程如下:

转换图片

original: ئۇيغۇرچە
transformed: ﺋﯘﻳﻐﯘﺭﭼﻪ
reversed: ﻪﭼﺭﯘﻐﻳﯘﺋ (这是转换之后反转完的最终结果,上面的intellij idea没有正常显示)
  • 最后渲染

我们最终把用工具转换完之后进行反转的字符串放到unity的Text控件看下效果:

渲染图片

很显然,我们达到了目的,最下面的文字的显示是没问题的。

4.2.2 Cocos

主要步骤:

1、翻译文本替换;
2、通过 https://github.com/Alimjan2009/uyghur_convert_util 工具中的UyBaseAndEx.toEx函数或fribidi 开源算法做字符转换;
3、字符反转
4、特殊字母参考 http://jrgraphix.net/research/unicode_blocks.php?block=12 这个字符串对照表,单独替换

注意:

由于uyghur_convert_util工具转换上面已经说了,这里就不再重复,直接给出fribidi的转换事例,但是fribidi配置比较繁琐,需要有很好的经验和学习能力,属于非常高级一点的做法,所以不推荐使用。

下面是具体事例步骤:

代码图片

  • 2、将fribidi算法的代码导入到游戏c++代码中

导入代码图片

  • 3、具体代码调用
extern"C" {
#include"fribidi.h"
}
std::string g_utf8_fribidi_convert(const std::string& orign)
{
    if (orign.empty()) {
        return "";
    }
    std::u32string str32;

    StringUtils::UTF8ToUTF32(orign, str32);
    std::u32string strVisual, t;
    FriBidiParType base_dir = (FriBidiParType)FRIBIDI_TYPE_ON;

    int length = str32.length();
    strVisual.resize(length);
    fribidi_log2vis((FriBidiChar*)&str32[0], length, &base_dir, (FriBidiChar*)&strVisual[0], 0, 0, 0);

    for (auto it = strVisual.begin(); it != strVisual.end(); ++it){
        int ch = *it;
        if (ch == 1652) {
            // 音符的特殊处理
            t.push_back(0x0621);
        }
        else if (*it != 0xFEFF) {
            t.push_back(*it);
        }
    }
    strVisual.swap(t);

    std::string ret;
    StringUtils::UTF32ToUTF8(strVisual, ret);
    return ret;
}

说明:

这个函数的作用就是将存储的unicode码转换成用于渲染的调整好顺序的unicode编码(从左到右渲染)
g_utf8_fribidi_convert 参数字符串编码格式是 UTF8 返回的参数字符串编码格式也是 UTF8

注意:

在 cocos 里面一般是用 Label标签 配合上面函数使用的 

例如:

local label = cc.Label:create()
local content = 'arabic text'
label:setString(g_utf8_fribidi_convert(content))

results matching ""

    No results matching ""