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