CefView / QCefView

A Qt Widget encapsulated CEF view based on QWidget
https://cefview.github.io/QCefView/
GNU Lesser General Public License v2.1
546 stars 144 forks source link

初始化setLocale为zh-CN生效,但再次setLocale为en-US后不生效,请问如何解决? #48

Closed xuchendev closed 2 years ago

xuchendev commented 2 years ago

在Windows平台下先设置为zh-CN image 然后在Web交互中更改为en-US image

tishion commented 2 years ago

这个需要暴露一个新接口了 CefRequestContext::SetPreference(const CefString& name, CefRefPtr value, CefString& error))

安排

tishion commented 2 years ago

可以使用QCefView.setPreference接口来更改已经初始化过的一些参数。

如果需要修改语言可以这样写:

      QString error;
      if (!qcefView->setPreference("intl.accept_languages", "zh-CN", error)) {
          // failed to set preference, show error message with `error`
      }
tishion commented 2 years ago

不过我觉得你的做法有点问题,你是想做多语言的应用,首先你的应用应该是分Qt原生部分和Webapp部分的,如果要做多语言比较好的模式应该如下实现:

  1. Qt原生实现多语言(实现方式根据你自己的应用而定)
  2. WebApp也实现多语言(可以通过URL传参数实现)

多语言切换的触发方式可以放在WebApp中,当用户点击WebApp中的切换语言按钮,通过InvokeMethod通知Native,然后再Qt的invokemethod相应中你需要做如下:

  1. 根据JS传入的目标语言参数,使Qt原生部分切换为目标语言
  2. 根据JS传入的目标语言参数,生成新的URL,然后通过QCefView的重新navigate到新的URL
xuchendev commented 2 years ago

不过我觉得你的做法有点问题,你是想做多语言的应用,首先你的应用应该是分Qt原生部分和Webapp部分的,如果要做多语言比较好的模式应该如下实现:

  1. Qt原生实现多语言(实现方式根据你自己的应用而定)
  2. WebApp也实现多语言(可以通过URL传参数实现)

多语言切换的触发方式可以放在WebApp中,当用户点击WebApp中的切换语言按钮,通过InvokeMethod通知Native,然后再Qt的invokemethod相应中你需要做如下:

  1. 根据JS传入的目标语言参数,使Qt原生部分切换为目标语言
  2. 根据JS传入的目标语言参数,生成新的URL,然后通过QCefView的重新navigate到新的URL

我们实现的机制类似,但是出现了一个问题,Web人员反馈他那边调用HTTP接口时候已经指定了Accept-Language,但是不生效,怀疑是被CEF进行了覆盖。所以我们想通过SetLocale这种方式来完成Accept-Language请求头更改。

xuchendev commented 2 years ago
intl.accept_languages

问题得到解决,牛批!