通过ADB更改设备语言

25

我想通过 ADB 改变语言。 我尝试:

adb shell setprop persist.sys.language fr;setprop persist.sys.country CA;stop;sleep 5;start

但是我会遇到错误:

setprop: command not found
stop: missing job name
Try `stop --help' for more information.
start: missing job name
Try `start --help' for more information.

出了什么问题?我想在实际设备上执行此操作。


1
我甚至不知道可以通过adb来做到这一点... - android developer
首先尝试获取交互式 shell,然后逐个发出命令。这可能会消除您的主机系统解释或更改一系列命令的任何问题(停止和启动错误消息看起来非常像是尝试在开发系统而不是 Android 设备上运行)。您还可以尝试在 adb shell 之后引用所有内容。 - Chris Stratton
可能是您的设备没有将setprop设置为可由adb用户访问。 - njzk2
@njzk2,那不是事实。 - Alex P.
15个回答

33

你的错误与 adb 无关。你必须先了解本地 shell 如何处理你的命令:你正在本地运行这些命令(在你的电脑上):

adb shell setprop persist.sys.language fr
setprop persist.sys.country CA
stop
sleep 5
start

你看到的错误信息来自本地 shell(即你的系统上没有 setprop 可执行文件,而且 startstop 命令有非可选参数。

正确的命令应该是

adb shell "setprop persist.sys.language fr; setprop persist.sys.country CA; setprop ctl.restart zygote"

引号之间的参数将传递给adb,而不是由本地shell解释。

在更近期的Android版本中,您还可以执行以下操作:

adb shell "setprop persist.sys.locale fr-CA; setprop ctl.restart zygote"

8
你仍然需要root权限。我只是解释了最显而易见的错误。 - Alex P.
我无法对我的设备进行root操作:/ - user3258796
@user3258796 - 看起来你无法通过这种方式实现你的目标,而是需要使用设备上的设置菜单。 - Chris Stratton

14

您可以更改设备的区域设置/语言以进行测试,而无需对设备进行root操作,即使在更新的(4.2+)设备上也是如此。您需要创建一个更改设备区域设置的应用程序。或者,您可以使用辅助应用程序,例如ADB更改语言

接下来,在4.2+设备上,您必须通过adb授予应用程序CHANGE_CONFIGURATION权限,adb shell pm grant <package_name> android.permission.CHANGE_CONFIGURATION

最后,您可以使用adb命令(启动活动)来切换区域设置。


1
Operation not allowed: java.lang.SecurityException: grantRuntimePermission: Neither user 10174 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS - Alaa M.
@AlaaM。我通过启用“USB调试(安全设置)”来解决了这个问题:https://dev59.com/VVQK5IYBdhLWcg3wT-Pe#53938414 - serg06

12

有几个解决方案。它对我有效。


1.

adb shell am start -a android.settings.LOCALE_SETTINGS (您可以看到语言菜单,然后通过appium选择语言)


2.

在Google商店上下载adbchangelanguage

adb shell pm grant net.sanapeli.adbchangelanguage android.permission.CHANGE_CONFIGURATION

adb shell am start -n net.sanapeli.adbchangelanguage/.AdbChangeLanguage -e language zh -e country TW

https://gist.github.com/douglasselph/b9998e69998759c6cceec1df1aa96ac5


3.

使用Appium设置所需的能力(语言和本地化) http://appium.io/docs/en/writing-running-appium/caps/


不适用于新的 API 31+ 设备。 - Ragen Dazs
1
我有一部中国手机(Vivo X90 Pro+),运行着OriginOS 3 / Android 13,这足以打开隐藏的语言菜单:adb shell am start -a android.settings.LOCALE_SETTINGS - miff2000

6

按照以下步骤进行:

  • Create emulator with google APIs Intel x86
  • Root the emulator, by running the command:

    adb root
    
  • Run the following shell command through adb:

    adb -e shell "su root; setprop persist.sys.locale pt-PT; stop; sleep 2; start” 
    

    then, exit the shell which restarts the emulator.

  • Locales we need for screenshots:

    de_DE
    en_EN
    fr_FR
    ko_KO
    pt_PT
    es_ES
    ja_JA
    

4

简单地说,这很混乱。

setprop 只适用于 AVD 或已获取 root 权限的物理设备。

另一种选择是使用 Launcher 中的设置。

对于已获取 Root 权限的设备或 AVD,此方法有效:

<android-sdk path>/platform-tools/adb shell
root@generic:/ # getprop persist.sys.language
getprop persist.sys.language
en
root@generic:/ # setprop persist.sys.language fr
setprop persist.sys.language fr
root@generic:/ # setprop persist.sys.country CA
setprop persist.sys.country CA
root@generic:/ # stop
stop
root@generic:/ # start
start
root@generic:/ # sleep 5
sleep 5
root@generic:/ # getprop |grep lang
getprop |grep lang
[persist.sys.language]: [fr]
root@generic:/ # getprop |grep country
getprop |grep country
[persist.sys.country]: [CA]
root@generic:/ #

它只能运行一次。当我第二次更改系统语言时,什么也不会发生。 - Maksim Dmitriev
我的设备是一个带有Android N的模拟器。 - Maksim Dmitriev

2

2

试试这个

adb shell "su -c 'setprop persist.sys.language fr; setprop persist.sys.country CA; stop; sleep 5; start'

您需要一个已经取得了root权限的设备。


错误的语法,可能是吧。我正在通过谷歌进行一些研究,以了解更多相关信息。或者,缺少的命令是因为未root设备隐藏了这些命令?不知道,我很久以前从某个地方得到过这个命令,在我使用它时起作用。 - Marco Acierno
我需要在未经root权限的设备上完成此操作。 - user3258796
您是否有使用Appium和Python更改语言的想法?我需要这个功能进行自动化测试。 - user3258796

1
如果有人需要帮助的话:我不小心将手机语言更改为一个叫做“en-XA”的有问题的语言(在用户界面中它被称为“英语一”?),结果我甚至无法解锁屏幕,但是我必须解决我的语言设置问题。我没有root权限,但幸运的是我刷了一个自定义恢复(TWRP)。

对我来说,解决方案是编辑/data/system/users/0/settings_system.xml文件,特别是这一行:

<setting id="24885" name="system_locales" value="en-XA,pl-PL" package="android" defaultValue="en-XA,pl-PL" defaultSysSet="true" preserve_in_restore="true" />

我将 en-XA 修改为 en-US,重新启动后,电话又能正常使用了!
你可以使用恢复内置的文件编辑器来编辑文件,或者使用 /adb pull /data/system/users/0/settings_system.xml 下载并在本地编辑该文件,然后使用 adb push settings_system.xml /data/system/users/0/settings_system.xml 将其更新到设备上。
顺便说一下,在修改 /data/property/persistent_properties 文件之前,我也将 en-XA 修改为 en-US,但是仅此不足,可能需要同时修改两个文件。
所有内容都在干净的 Android 11 设备上进行了测试。

1
在模拟器上: 当手动更改语言后,它停止工作并且必须在AVD管理器中清除模拟器的数据才能使其重新工作。
使用的脚本如下:
adb shell "su 0 setprop persist.sys.locale ja";adb shell "su 0 setprop ctl.restart zygote"

如果脚本中的某些命令依赖于设备准备就绪,可以在结尾处添加;sleep 20


1

根据官方文件

可以使用adb shell在模拟器中更改语言环境。

  1. Pick the locale you want to test and determine its BCP-47 language tag, for example, Canadian French would be fr-CA.

  2. Launch an emulator.

  3. From a command-line shell on the host computer, run the following command:

    adb shell
    

    or if you have a device attached, specify that you want the emulator by adding the -e option:

    adb -e shell
    
  4. At the adb shell prompt (#), run this command:

    setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
    

将步骤1中的适当代码替换成括号内的部分。

例如,要测试加拿大法语:

  setprop persist.sys.locale fr-CA;stop;sleep 5;start 

这将导致模拟器重新启动。(看起来像是完全重启,但实际上并不是。)一旦主屏幕再次出现,重新启动您的应用程序,应用程序将以新的语言环境启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接