前言

  美术制作人员通常英文水平都不太好,因此不大希望使用软件的英文版本。
  但是出于对 Maya 技术支持的考虑,还是使用英文版较为稳定,而且维护起来更加可靠
  由于 Python2 对于 Unicode 字符处理的不友好,使用中文很容易导致一些意料之外的问题。

  另外关于 Maya 切换语言的版本其实网上都有相关的文章讲解,这里我总结到一起而已。

方案一 添加环境变量

参考链接

  打开 windows 的环境变量编辑器,然后添加 MATA_UI_LANGUAGE 变量
  变量可以设置为 en_US (英文版) | zh_CN (中文版)

方案二 修改 Maya 安装目录 l10n 文件夹下的语言名称

参考链接

  去到 Maya 的安装目录,可以找到 resources 文件夹
  打开 resources\l10n 的目录,就可以知道两种语言的文件夹,将文件夹名称 zh_CN 修改为 en_US 就可以切换为英文版。

两个方案区别

  其实两者实现的效果是一致的,只是如果在系统的环境变量上设置了之后,会影响到所有的 Maya 版本。
  如果只是修改文件夹名称则只对安装的 maya 起到修改效果。


  理论上是可以在 Maya.env 文件上添加 MATA_UI_LANGUAGE=en_US 来切换语言,但是我测试并不起作用。
  官方文档 官方文档提到 Maya.env 设置语言变量是不起作用的,必须设置系统环境变量。

代码自动切换方案分析

  个人不推荐通过代码修改 windows 下的环境变量,一方面需要管理员权限,而且后续的操作可能会对环境变量造成污染。
  系统的环境变量就是个坑,尽量只用来配合 cmd 命令行调用程序,不要将配置放到里面去,否则出错都不知道坑在哪里!~


  当然修改文件夹名字通常不需要系统管理员权限,但是如果 Maya 安装在 默认的 C 盘目录,那恐怕也逃不过这个操作。
  其实代码操作非常简单,修改目录名称只需要用到 os.rename 即可,最大的难点就是需要先获取到系统管理员。

系统管理员权限获取

  下面讨论的是围绕 windows 平台,美术制作人员基本不考虑使用其他平台。

通过 runas 手动获取管理员权限

  windows 下可以通过 runas 命令来获取管理员权限,但是这样会有 UAC 弹窗告诉用户。
  如果用户是系统管理员会提示是否给程序运行的权限,如果用户不是管理员还会弹出账号密码的输入框。
  不过大多数时候有 UAC 窗口也是个好事,至少告诉用户这个操作需要系统权限,用户不爽就不给权限不操作而已。


  其实获取系统权限的方法也是参考网上提供的方案 CSDN
  通过网页里面提到的方法可以实现用管理员权限开启 Python 然后用管理员权限跑脚本。
  这样就可以另外写一个执行脚本,然后通过管理员权限跑 os.rename 代码来对目录进行更名了。

  不过我觉得这样要多写一个 python 脚本,有点多余,其实可以通过 cmd 命令来修改文件名称的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import os
import sys
import ctypes
import platform

try:
from PySide2.QtWidgets import QMessageBox,QApplication
except:
from PySide.QtGui import QMessageBox,QApplication

def modifyMayaLanguge():

# NOTE 获取cmd.exe的本地路径 https://stackoverflow.com/questions/49545009
is_wow64 = (platform.architecture()[0] == '32bit' and 'ProgramFiles(x86)' in os.environ)
system32 = os.path.join(os.environ['SystemRoot'], 'SysNative' if is_wow64 else 'System32')
cmd_exe = os.path.join(system32,"cmd.exe")

# NOTE sys.executable 在 maya 里面运行获取到的是 maya.exe 的路径
maya_path = os.path.realpath(sys.executable)
bin = os.path.dirname(maya_path)
install_dir = os.path.dirname(bin)
l10n = os.path.join(install_dir,"resources","l10n")

# NOTE 判断当前是否中文版
zh_CN = os.path.join(l10n,"zh_CN")
en_US = os.path.join(l10n,"en_US")
if os.path.exists(en_US) and not os.path.exists(zh_CN):
QMessageBox.information(QApplication.activeWindow(),u'提示',u'当前已经是英文版,无需切换')
return

# NOTE 执行cmd命令行命令 修改 l10n 文件夹名称 切换Maya为英文版
command = u'rename "{zh_CN}" "en_US" '.format(zh_CN=zh_CN)
# NOTE 获取权限改名
result = ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(cmd_exe), unicode('/c "%s"' % command), None, 1)

# NOTE 返回 5 说明没有提供权限
if result == 5:
QMessageBox.information(QApplication.activeWindow(),u'提示',u'没有获取到权限,命令执行不成功')
else:
# NOTE 修改成功提示框
QMessageBox.information(QApplication.activeWindow(),u'提示',u'Maya 成功切换为 英文版 \n 将自动重启Maya')
# NOTE 重启 Maya
os.startfile(maya_path)
QApplication.quit()

if __name__ == "__main__":
modifyMayaLanguge()

PsExec 静默获取管理员权限

PsExec官方文档&下载地址

1
2
3
4
# 基本用法
PsExec -u 账户域\账户名称 -p 账户密码 E:/anaconda2/python.exe E:/test/copy_test.py
# 示范代码 : 管理员权限打开 cmd 命令行窗口
PsExec -u DIGITAL\timmyliang -p 123456 cmd

  PsExec 可以通过输入已知的管理员账号密码来获取权限,这样既可以保证美术人员没有权限乱搞也可以让程序带权限运行。
  通过 PsExec 调用 Python 也未必有管理员权限,还需要通过上面博客的方式添加到 Python 脚本里面确保获取到了管理员权限。
  由于 PsExec 调用的 Python 已经输入过管理员权限密码,因此脚本运行就不会弹出 UAC 权限窗口。


  使用 PsExec 调用共享路径的 Python.exe 会导致错误,有可能不是本地调用的缘故
  可以借助 cmd /c 命令来外调 Python 脚本

1
PsExec -u DIGITAL\timmyliang  -p 123456 cmd /c \\10.99.1.4\ftdy\hq_tool\programs\python\Python2.7.11\python.exe E:/test/copy_test.py

总结

  Maya 设计有个不太好的地方就是语言切换没有使用 Qt 的 i18n 而是弄了 l10n,导致切换语言要重启 Maya 还是挺不方便的。
  当然如果不打开Maya的前提下成功执行了脚本,就不需要重启了。
  但是 Maya 对应的版本以及本地路径还是需要有的,如果不在一个运行的 Maya 中获取,很容易出问题(:з」∠)