eric6/WebBrowser/WebBrowserLanguagesDialog.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
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

eric ide

mercurial