|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2009 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog to configure the preferred languages. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 |
|
12 from PyQt5.QtCore import pyqtSlot, QLocale, QStringListModel |
|
13 from PyQt5.QtWidgets import QDialog |
|
14 |
|
15 from .Ui_WebBrowserLanguagesDialog import Ui_WebBrowserLanguagesDialog |
|
16 |
|
17 import Preferences |
|
18 |
|
19 |
|
20 class WebBrowserLanguagesDialog(QDialog, Ui_WebBrowserLanguagesDialog): |
|
21 """ |
|
22 Class implementing a dialog to configure the preferred languages. |
|
23 """ |
|
24 def __init__(self, parent=None): |
|
25 """ |
|
26 Constructor |
|
27 |
|
28 @param parent reference to the parent widget (QWidget) |
|
29 """ |
|
30 super(WebBrowserLanguagesDialog, self).__init__(parent) |
|
31 self.setupUi(self) |
|
32 |
|
33 self.__model = QStringListModel() |
|
34 self.languagesList.setModel(self.__model) |
|
35 self.languagesList.selectionModel().currentChanged.connect( |
|
36 self.__currentChanged) |
|
37 |
|
38 languages = Preferences.toList(Preferences.Prefs.settings.value( |
|
39 "WebBrowser/AcceptLanguages", self.defaultAcceptLanguages())) |
|
40 self.__model.setStringList(languages) |
|
41 |
|
42 allLanguages = [] |
|
43 for index in range(QLocale.C + 1, QLocale.LastLanguage + 1): |
|
44 allLanguages += self.expand(QLocale.Language(index)) |
|
45 self.__allLanguagesModel = QStringListModel() |
|
46 self.__allLanguagesModel.setStringList(allLanguages) |
|
47 self.addCombo.setModel(self.__allLanguagesModel) |
|
48 |
|
49 def __currentChanged(self, current, previous): |
|
50 """ |
|
51 Private slot to handle a change of the current selection. |
|
52 |
|
53 @param current index of the currently selected item (QModelIndex) |
|
54 @param previous index of the previously selected item (QModelIndex) |
|
55 """ |
|
56 self.removeButton.setEnabled(current.isValid()) |
|
57 row = current.row() |
|
58 self.upButton.setEnabled(row > 0) |
|
59 self.downButton.setEnabled( |
|
60 row != -1 and row < self.__model.rowCount() - 1) |
|
61 |
|
62 @pyqtSlot() |
|
63 def on_upButton_clicked(self): |
|
64 """ |
|
65 Private slot to move a language up. |
|
66 """ |
|
67 currentRow = self.languagesList.currentIndex().row() |
|
68 data = self.languagesList.currentIndex().data() |
|
69 self.__model.removeRow(currentRow) |
|
70 self.__model.insertRow(currentRow - 1) |
|
71 self.__model.setData(self.__model.index(currentRow - 1), data) |
|
72 self.languagesList.setCurrentIndex(self.__model.index(currentRow - 1)) |
|
73 |
|
74 @pyqtSlot() |
|
75 def on_downButton_clicked(self): |
|
76 """ |
|
77 Private slot to move a language down. |
|
78 """ |
|
79 currentRow = self.languagesList.currentIndex().row() |
|
80 data = self.languagesList.currentIndex().data() |
|
81 self.__model.removeRow(currentRow) |
|
82 self.__model.insertRow(currentRow + 1) |
|
83 self.__model.setData(self.__model.index(currentRow + 1), data) |
|
84 self.languagesList.setCurrentIndex(self.__model.index(currentRow + 1)) |
|
85 |
|
86 @pyqtSlot() |
|
87 def on_removeButton_clicked(self): |
|
88 """ |
|
89 Private slot to remove a language from the list of acceptable |
|
90 languages. |
|
91 """ |
|
92 currentRow = self.languagesList.currentIndex().row() |
|
93 self.__model.removeRow(currentRow) |
|
94 |
|
95 @pyqtSlot() |
|
96 def on_addButton_clicked(self): |
|
97 """ |
|
98 Private slot to add a language to the list of acceptable languages. |
|
99 """ |
|
100 language = self.addCombo.currentText() |
|
101 if language in self.__model.stringList(): |
|
102 return |
|
103 |
|
104 self.__model.insertRow(self.__model.rowCount()) |
|
105 self.__model.setData(self.__model.index(self.__model.rowCount() - 1), |
|
106 language) |
|
107 self.languagesList.setCurrentIndex( |
|
108 self.__model.index(self.__model.rowCount() - 1)) |
|
109 |
|
110 def accept(self): |
|
111 """ |
|
112 Public method to accept the data entered. |
|
113 """ |
|
114 result = self.__model.stringList() |
|
115 if result == self.defaultAcceptLanguages(): |
|
116 Preferences.Prefs.settings.remove("WebBrowser/AcceptLanguages") |
|
117 else: |
|
118 Preferences.Prefs.settings.setValue( |
|
119 "WebBrowser/AcceptLanguages", result) |
|
120 super(WebBrowserLanguagesDialog, self).accept() |
|
121 |
|
122 @classmethod |
|
123 def httpString(cls, languages): |
|
124 """ |
|
125 Class method to convert a list of acceptable languages into a |
|
126 byte array. |
|
127 |
|
128 The byte array can be sent along with the Accept-Language http header |
|
129 (see RFC 2616). |
|
130 |
|
131 @param languages list of acceptable languages (list of strings) |
|
132 @return converted list (QByteArray) |
|
133 """ |
|
134 processed = [] |
|
135 qvalue = 1.0 |
|
136 for language in languages: |
|
137 leftBracket = language.find('[') |
|
138 rightBracket = language.find(']') |
|
139 tag = language[leftBracket + 1:rightBracket] |
|
140 if not processed: |
|
141 processed.append(tag) |
|
142 else: |
|
143 processed.append("{0};q={1:.1f}".format(tag, qvalue)) |
|
144 if qvalue > 0.1: |
|
145 qvalue -= 0.1 |
|
146 |
|
147 return ", ".join(processed) |
|
148 |
|
149 @classmethod |
|
150 def defaultAcceptLanguages(cls): |
|
151 """ |
|
152 Class method to get the list of default accept languages. |
|
153 |
|
154 @return list of acceptable languages (list of strings) |
|
155 """ |
|
156 language = QLocale.system().name() |
|
157 if not language: |
|
158 return [] |
|
159 else: |
|
160 return cls.expand(QLocale(language).language()) |
|
161 |
|
162 @classmethod |
|
163 def expand(cls, language): |
|
164 """ |
|
165 Class method to expand a language enum to a readable languages |
|
166 list. |
|
167 |
|
168 @param language language number (QLocale.Language) |
|
169 @return list of expanded language names (list of strings) |
|
170 """ |
|
171 allLanguages = [] |
|
172 countries = [l.country() for l in QLocale.matchingLocales( |
|
173 language, QLocale.AnyScript, QLocale.AnyCountry)] |
|
174 languageString = "{0} [{1}]"\ |
|
175 .format(QLocale.languageToString(language), |
|
176 QLocale(language).name().split('_')[0]) |
|
177 allLanguages.append(languageString) |
|
178 for country in countries: |
|
179 languageString = "{0}/{1} [{2}]"\ |
|
180 .format(QLocale.languageToString(language), |
|
181 QLocale.countryToString(country), |
|
182 '-'.join(QLocale(language, country).name() |
|
183 .split('_')).lower()) |
|
184 if languageString not in allLanguages: |
|
185 allLanguages.append(languageString) |
|
186 |
|
187 return allLanguages |