pyqt5 - qtextedit - Input Language - pyqt5

Is there a way to change the input keyboard layout in a Qt app? I want to be able to input in the same QTextEdit Widget in English and Russian by switching between languages frequently. One option is to have the cyrillic keyboard activated on Windows and switching between input languages using the windows key and the spacebar.
I want to bypass the feature though on the os level and implement it directly in my app by defining a shortcut or a push button to select the input language. The reason being that the end users (Russian speakers) will be using the app on an English language PC and they should not have to fiddle around with OS settings in a foreign language. The keyboards in use have an English layout with additional Cyrillic characters so typing should not be a problem.
I want to ask if there is a direct method (it would make sense to have one, i hope I am just unable to find it). I could overload the keyPressEvent for my widget as a last alternative. I just hope that there is a better way to do it since I am switching between standard languages.

Overriding keyPressEvent.
Returning cyril characters instead of the texts of QKeyEvent.
Making QMenu for switching the language.
for example,
#class QTextEdit
def keyPresEvent(self, event):
if self.isCurrentWritingSystem == "Russian":
#If you use english keyboard...
if event.key() == Qt.Key_A:
tc = self.textCursor()
tc.insertText("ф")
return
... for others ↓
else:
#codes for normal russian keyboard you don't need to do anything.
return super().keyPressEvent(event)
On the other hand, if you use russian keyboard as default.
if self.isCurrentWritingSystem == "English":
#if you use russian keyboard...
if event.key() == Qt.Key_A:
tc = self.textCursor()
tc.insertText("a")
return
else:
#codes for normal english keyboard. you don't need to do anything.
return super().keyPressEvent(event)

Related

Sticky Scroll with custom language

In vscode, the new Sticky scroll doesn't seem to work out of the box with my custom language extension. Is there some interface my language needs to implement in order to support it?
The new Sticky Scroll feature seems to be based on the language elements (class/interface/namespace/function/method/constructor) being recognized, and available in the Outline view. This means your custom language must have a Language Server or any other tooling that provides such elements to the editor.
If your language does provide that, but is not being properly supported in the new Sticky Scroll feature, I suggest you to open an issue in VS Code repo. As you can see (https://github.com/microsoft/vscode/labels/editor-sticky-scroll), there are a few issues reported.
Hope this helps
That could change with VSCode 1.72 and issue 157165 "Add option to base Sticky Scroll on indent, not Document Symbols"
Basing Sticky Scroll on class/function/namespace etc. makes a lot of sense, but only as long as there is an active language server or language extension that provides good Document Symbols (Outline).
For all languages that either have no LSP (so, so many), whose LSP provides no Outline, whose LSP provide invalid Outline or which simply have no concept of functions/classes etc., Sticky Scroll can not be leveraged :-(
I'd argue that in many cases the respective context could be inferred from the indentation instead.
I realize this may not be desirable by default, so perhaps it should be either hidden behind a flag or configurable per language. For example, in a large JSON file, you might then get this context:
1 {
51 "a": {
52 "b": [
-----------------------------------------------
74 "current_line",
75 "..."
Personally, I'd like to have SS in CoffeeScript, Crystal, AutoHotkey, Markdown, JSON, and pretty much everywhere else except maybe plain text files.
This implemented with PR 159198;
When no document symbol provider use the folding model for the sticky scroll:
This is available in VSCode insiders today.

How to change the chromium default language by modify the source code?

I'm working on a Chromium project, which requires change the default language from english to Chinese from the source code,and now open a Chinese page will appear garbled situation.
I modify the method GetApplicationLocale() in src/content/public/browser/content_browser_client.cc: return "en-US" to return "zh-CN", but it doesn't work.
I want to change the language by modifing the source code rather than the setting button "Language and input settings".
It is not possible to change the language of browser from source code. You can detect which language it is currently using and then ask user to change it.
Here is how you can do it using javaScript:
var language = navigator.language || navigator.userLanguage;

XCUIElement.typeText() is not typing the correct text because of spelling correction. What can I do?

In my UI tests, I want to type some text in a text field which is in a table cell.
So I did this:
let textField = tablesQuery.elementBoundByIndex(index).textFields.elementBoundByIndex(0)
textField.tap()
textField.typeText("Snell's Law\r")
When I run the test, it successfully found the text field and started typing. But instead of typing "Snell's Law", it typed "said last"!
I think this is due to that annoying spell checking thingy that always pops up.
So I went into the settings, and turn the spell checking off:
I ran the test and see that it still types "said last"! So I went back to the settings and check whether I have turned spell checking off properly.
And to my surprise, the spell checking is indeed off! What is happenning? How can I stop the annoying spell checker?
The feature is Auto-correction rather than Spelling correction, which is available on physical devices. In order to prevent the text field from presenting an auto-correct option, you should disable the feature on the text field in your app code/storyboard, if this is a field where autocorrection may not be appropriate, e.g. A search field.
Auto-correction works well for natural language fields for free-flowing text, but not as well for simple, short phrases.
You could use SBTUITestTunnel. This framework extends UI Test's adding several features (net mocking, remote code invocation) among which you can also disable UITextfields autocomplete for a specific test.
Once you install the framework, you would fire up the application in your test target like this:
func testExample() {
let app = SBTUITunneledApplication()
app.launchTunnelWithOptions([SBTUITunneledApplicationLaunchOptionDisableUITextFieldAutocomplete]) {
// do additional setup before the app launches, if needed
}
// From here on UITextField's autocomplete will be disabled
}

How to fake keyboard event to widget in Qt5

I have made a custom virtual keyboard widget for my kiosk application, and now comes the time when I want it to produce fake keyboard events and feed them to an QLineEdit of choice.
I do the following:
// target is the QWidget to receive the events
// k is the Qt::Key (keycode) I want to send (Testing with an 'A')
Qt::Key k=Qt::Key_A;
if(0!=target){
//According to docs this will be freed once posted
QKeyEvent * press=new QKeyEvent(QKeyEvent::KeyPress, (int )k,0);
QKeyEvent * release=new QKeyEvent(QKeyEvent::KeyRelease, (int )k,0);
//Give the target focus just to be sure it is available for input
target->setFocus();
//Post the events (queue up and let the target consume them when the eventloop gets around to the target)
QCoreApplication::postEvent ( target, press) ;
QCoreApplication::postEvent ( target, release) ;
}
I see the target widget receive focus, but there are no letters typed into the input field like I would expect. What am I doing wrong? Which assumptions are wrong?
PS: I know that this could be solved by using existing virtual keyboards or at least using the platform interface as is done in this post. In our approach we have decided to build the kayboard into the application to obtain full control over the UX and keyboard design.
Thanks!
Since no-one stepped up, I will try to provide some closure.
It turns out that Qt5 comes with a library of testing facilities called testlib. It has all sorts of goodies to facilitate easy creation, management and running of unit tests for Qt application. Among these facilities there is a set of functions for sending fake events such as fake typing of text, mouse clicks etc. It is quite comprehensive and covers many use-cases. Since this is used internally by Qt developers to test Qt itself it is also production proven code.
I simply copied what I needed from there.

Automatic text translation at MSDN pages - How to turn off?

Is there a way to turn off the automatic text translation at the MSDN library pages ?
I do prefer English text but due to having a German IP address Microsoft activates the automatic translation on every new page load which gives me a yellow box with a German translation of the text I am currently hovering over with the mouse.
This happens regardless what language is initially set in the right upper corner and regardless of whether I am logged in or not.
I can't tell how annoying this is !!
Any ideas, anyone ?
When you hit the "Original" radio button at the top, you see English, with German in the yellow hover box.
If you visit the original English site, you don't see a translation, not even on hover.
You switch to English by replacing /de-de/ in the URL with /en-us/. As in
German (translation or original with translation on hover):
http://msdn.microsoft.com/de-de/library/system.diagnostics.contracts.contractargumentvalidatorattribute(v=vs.110).aspx
English only (no translation):
http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contractargumentvalidatorattribute(v=vs.110).aspx
If you are a firefox user, you can use Redirector addon. Create a new redirect and set it up like this:
It will automatically redirect all msdn requests to english non-translated versions.
Found it! I mean, it's 2016, 3 years late, and maybe they just added it recently, but when you scroll all the way down there's a small button in the left bottom corner where you can choose language you want to use (more specifically a country "you're from").
MSDN uses the prefered language from your web browser settings.
http://social.msdn.microsoft.com/Forums/en-US/6543407d-f743-48fb-965b-b8af9f9a0cb1/howto-disable-automatic-translation-into-german?forum=msdnfeedback
This is due to the Accept-Language header:
http://www.w3.org/International/questions/qa-accept-lang-locales
So setting your browser to prefer English language websites should fix this problem. W3C has an overview how to do that on different browsers here:
http://www.w3.org/International/questions/qa-lang-priorities.en.php
There is a chrome addon aswell
Switcheroo-Redirector
I got tired of replacing manually the url of the MSDN docs to target en-us in the url, so I came up with this little user script for the very handy Tampermonkey extension (available on Chrome, Microsoft Edge, Opera, and Firefox)
// ==UserScript==
// #name MSDN docs [en-us] redirect
// #version 0.1
// #description Redirects to the en-us version of the current MSDN doc page
// #grant none
// #match https://learn.microsoft.com/*
// ==/UserScript==
(function () {
let pathname = window.location.pathname.split('/');
if (pathname[1].toLowerCase() !== 'en-us') {
pathname[1] = 'en-us';
pathname = pathname.join('/');
window.location.href = window.location.origin + pathname + window.location.search;
}
})();
Once you have the extension installed,
Click on its icon
Click on Create a new script...
Paste the previous code
Save it (Ctrl + S or File > Save).
Test the redirection: https://learn.microsoft.com/fr-fr/dotnet/csharp/programming-guide/classes-and-structs/classes
The #match property will ensure that this script is only run against MSDN doc pages.
Recently I came across the same problem. And I solved it with Chrome extension ModHeader.
I configured and it works:
I know it's an old question, by maybe this insight will be useful to someone.
I almost always open msdn through a search in google. It most of the time offered me site translated to my local language (through a part of the address with locale), sometimes accompanied by original (English) version next to it. If I click on the original language link, it does not translate anything, so it is not automatic translation based on my localization.
What solved my problem was to change google search settings to prefer English, rather than my native language. Go to google search settings, set Which language should Google products use? to English, then in Currently showing search results in: click Edit and check other languages you are likely to search in.
It will also change the UI language for google. I know it might be a high price to pay, but I believe it is worth it. If you search for a query typed in given language, results will most likely result in this language pages anyway.
Instead of extensions, which will consume memory and are a bit overkill for that kind of thing, you can use a custom search query.
Chrome
Settings => Manage Search Engines, add this entry:
Engine: MSDN US
Keyword: ms
URL: https://social.msdn.microsoft.com/Search/en-US?query=%s (or whatever the proper url is at the time of your reading, just use %s wherever it needs the actual query string)
Now, in the address bar, just type ms [SPACE]. As soon as you press the space, it will prompt you with Search on MSDN US:. Just type your query now. For instance ms string will redirect you to the MSDN-US version of the search results for string. Of course you can change the title and keyword.
I'm sure the other common browsers expose that kind of functionality too. On Firefox, I used to plug custom search engines on the search bar.
This is a neat trick that I use for all kinds of searches (SO, Amazon, Wikipedia in different languages, etc.). It's very efficient.
Usually there is a language link at the bottom of the page where you can change language (even though a permanent site specific setting would be much nicer).
In IE in Internet Options Panel you have Apperrance part in General Tab. Add preffered language as a first and from now on all pages from MSDN will be presented in choosen language
I'm using NoScript addon with Firefox (actually Waterfox), just forbib "m-msft.com", the translator will be turned off. I think you can use other plugins in other browser to forbid the domain too. NoScript is a must have addon for any serious web user, and UserStyles, of course.