From 9665a2e781e171e9993276bf4b97b5dfa5fcc33a Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Tue, 1 Feb 2022 10:34:02 +0900 Subject: [PATCH 01/15] =?UTF-8?q?tweepy=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/history.txt | 1 + twitterService.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/public/history.txt b/public/history.txt index ef71f2d..a4fd62c 100644 --- a/public/history.txt +++ b/public/history.txt @@ -2,6 +2,7 @@ windows Native Peing Connector(NPC) 更新履歴 2022/XX/XX Version 1.3.1 1. 回答者がPeingIDを変更したことをNPCが検知した後で変更後のPeingIdをNPCに登録しようとした場合に、既に登録されているというエラーが表示されていた不具合を修正しました。 +2. Twitterのフォローリストからの一括登録が動作しなくなった問題に対応しました。 2021/12/18 Version 1.3.0 1. カーソルのあった質問の位置を次回起動時に引き継ぐ機能を追加しました。 diff --git a/twitterService.py b/twitterService.py index 8d0442d..6909f0f 100644 --- a/twitterService.py +++ b/twitterService.py @@ -79,17 +79,17 @@ def getFollowList(token,target): try: user = twitterApi.get_user(screen_name=target) friendsCount = user.friends_count - friends = tweepy.Cursor(twitterApi.friends,screen_name=target,include_user_entities=False,skip_status=True,count=200).items() + friends = tweepy.Cursor(twitterApi.get_friends,screen_name=target,include_user_entities=False,skip_status=True,count=200).items() for friend in friends: ret.append(friend.screen_name) return ret - except tweepy.error.RateLimitError: + except tweepy.TooManyRequests: log.error("rateLimitError") return ret - except tweepy.error.TweepError as e: + except tweepy.TweepyException as e: log.error(e) log.error("%s" %(e.response)) return errorCodes.TWITTER_ERROR - except Exception: + except Exception as e: log.error(e) return errorCodes.UNKNOWN From 79e2d2cb7d602dd665150414ba8a06d052fb894b Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sat, 19 Feb 2022 18:32:07 +0900 Subject: [PATCH 02/15] update requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 14950bb..dedbddd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,4 @@ bs4 lxml https://github.com/actlaboratory/proxyutil/archive/0.2.4.zip https://github.com/actlaboratory/diff_archiver/archive/v1.0.1.zip -https://github.com/actlaboratory/twitter-authorization/archive/1.0.2.zip +https://github.com/actlaboratory/twitter-authorization/archive/2.0.2.zip From 00a4c41e1524d71056a003b5b3bd2c3bd9cafbfb Mon Sep 17 00:00:00 2001 From: guredora Date: Sat, 19 Feb 2022 19:00:08 +0900 Subject: [PATCH 03/15] =?UTF-8?q?=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=81=8B=E3=82=89=E7=B9=B0=E3=82=8A=E8=BF=94?= =?UTF-8?q?=E3=81=97=E3=82=A2=E3=83=83=E3=83=97=E3=83=87=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=82=92=E5=AE=9F=E8=A1=8C=E3=81=97=E3=81=9F=E6=99=82=E3=81=AB?= =?UTF-8?q?=E7=99=BA=E7=94=9F=E3=81=99=E3=82=8B=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- views/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/views/main.py b/views/main.py index f4f4d2e..9ecb36f 100644 --- a/views/main.py +++ b/views/main.py @@ -18,6 +18,7 @@ import menuItemsStore import service import twitterService +import update from .base import * from simpleDialog import * @@ -494,7 +495,7 @@ def OnMenuSelect(self,event): d.Show() if selected == menuItemsStore.getRef("HELP_UPDATE"): - globalVars.update.update() + update.checkUpdate() if selected==menuItemsStore.getRef("HELP_VERSIONINFO"): d = versionDialog.versionDialog() From 6589336211bd11f43ad5b4a9ee131650db60e5d8 Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Wed, 23 Nov 2022 20:03:51 +0900 Subject: [PATCH 04/15] fix requirements --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index dedbddd..7aa18e8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ -wxpython>=4.1 +wxpython==4.1 pywin32 winpaths -pyinstaller>=4 +pyinstaller==5.3 pyperclip requests bs4 From 8817369a62aaae932f59740f8cdba030aa18e61d Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Fri, 20 Jan 2023 12:43:30 +0900 Subject: [PATCH 05/15] =?UTF-8?q?=E8=A4=87=E6=95=B0=E8=A1=8C=E3=81=AE?= =?UTF-8?q?=E8=B3=AA=E5=95=8F=E3=83=BB=E5=9B=9E=E7=AD=94=E3=81=AE=E5=85=A5?= =?UTF-8?q?=E5=8A=9B=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DefaultSettings.py | 3 ++- public/history.txt | 3 +++ public/readme.txt | 5 +++++ views/SimpleInputDialog.py | 12 +++++++----- views/answerDialog.py | 5 ++++- views/main.py | 5 ++++- views/settingsDialog.py | 2 ++ 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/DefaultSettings.py b/DefaultSettings.py index 7493007..6fdd267 100644 --- a/DefaultSettings.py +++ b/DefaultSettings.py @@ -19,7 +19,8 @@ def get(): config["view"]={ "font": "bold 'MS ゴシック' 22 windows-932", "colorMode":"normal", - "textwrapping":"off" + "textwrapping":"off", + "enableMultiline":False, } config["speech"]={ "reader" : "AUTO" diff --git a/public/history.txt b/public/history.txt index 49c0197..c180f29 100644 --- a/public/history.txt +++ b/public/history.txt @@ -1,5 +1,8 @@ windows Native Peing Connector(NPC) 更新履歴 +2023/XX/XX Version 1.X.X +1. オプション設定に、複数行の質問・回答を入力可能にするかどうかの設定を追加しました。 + 2022/02/02 Version 1.3.2 1. リスト上の項目を選択していない状態でソフトウェアを終了しようとした場合、エラーとなってしまう不具合を修正しました。 diff --git a/public/readme.txt b/public/readme.txt index c16423e..04273f1 100644 --- a/public/readme.txt +++ b/public/readme.txt @@ -302,6 +302,11 @@ NPCの表示に使用する言語を設定します。 [画面幅で折り返し]を選択すると、画面幅に合わせて折り返しが行われます。 規定では[折り返さない]に設定されています。 +4.4.1.3.4 複数行の質問・回答を入力可能にする +質問の投稿、届いた質問への回答時に、複数行の入力を可能にするかどうかを設定します。 +この設定をチェックした場合、入力欄でEnterキーを押すことで、改行を挿入できるようになります。 +規定ではチェックされていません。 + 4.4.1.4 ネットワーク NPCの自動更新や、Peingとの通信にプロキシサーバーを使用する場合に必要な設定を行います。 diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index 2e10954..62aab06 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -11,28 +11,30 @@ from logging import getLogger from views.baseDialog import * +DEFAULT_STYLE=wx.BORDER_RAISED|wx.TE_DONTWRAP + class Dialog(BaseDialog): - def __init__(self,title,detail,parent=None,validationPattern=None): + def __init__(self,title,detail,parent=None,validationPattern=None,defaultValue="",style=0): super().__init__("SimpleInputDialog") self.title=title self.detail=detail + self.default=defaultValue if parent!=None: self.parent=parent else: self.parent=self.app.hMainView.hFrame self.validationPattern = validationPattern + self.style=style def Initialize(self): - self.log.debug("created") super().Initialize(self.parent,self.title) self.InstallControls() - self.log.debug("Finished creating view - %s" % self.title) return True def InstallControls(self): """いろんなwidgetを設置する。""" self.creator=views.ViewCreator.ViewCreator(self.viewMode,self.panel,self.sizer,wx.VERTICAL,20,style=wx.ALL|wx.EXPAND,margin=20) - self.edit,self.static=self.creator.inputbox(self.detail,x=-1,style=wx.BORDER_RAISED|wx.TE_DONTWRAP,sizerFlag=wx.EXPAND) + self.edit,self.static=self.creator.inputbox(self.detail,defaultValue=self.default,x=-1,style=DEFAULT_STYLE|self.style,sizerFlag=wx.EXPAND) self.edit.hideScrollBar(wx.HORIZONTAL) self.creator=views.ViewCreator.ViewCreator(self.viewMode,self.panel,self.sizer,wx.HORIZONTAL,20,style=wx.ALIGN_RIGHT) @@ -41,7 +43,7 @@ def InstallControls(self): def ok(self,event): if self.validationPattern: - if len(re.sub(self.validationPattern,"\\1",self.edit.GetLineText(0))) != len(self.edit.GetLineText(0)): + if not re.fullmatch(self.validationPattern,self.edit.GetLineText(0)): return event.Skip() diff --git a/views/answerDialog.py b/views/answerDialog.py index a1f818c..642edf3 100644 --- a/views/answerDialog.py +++ b/views/answerDialog.py @@ -84,7 +84,10 @@ def load(self): def answer(self,event): q = self.lst[self.hListCtrl.GetFocusedItem()].question - d = views.SimpleInputDialog.Dialog(_("回答の入力"),q,self.wnd) + style = 0 + if self.app.config.getboolean("view", "enableMultiline", False): + style = wx.TE_MULTILINE + d = views.SimpleInputDialog.Dialog(_("回答の入力"),q,self.wnd, style=style) d.Initialize() if d.Show()==wx.ID_CANCEL: return diff --git a/views/main.py b/views/main.py index 9ecb36f..2b81a7c 100644 --- a/views/main.py +++ b/views/main.py @@ -587,7 +587,10 @@ def postQuestion(self,target,parent=None): if not self.loginCheck(): return - d = SimpleInputDialog.Dialog(_("質問を投稿"),_("%sさんへの質問内容") % target.getViewString(), parent) + style = 0 + if self.parent.app.config.getboolean("view", "enableMultiline", False): + style = wx.TE_MULTILINE + d = SimpleInputDialog.Dialog(_("質問を投稿"),_("%sさんへの質問内容") % target.getViewString(), parent, style=style) d.Initialize() r = d.Show() if r==wx.ID_CANCEL: diff --git a/views/settingsDialog.py b/views/settingsDialog.py index 3fcb692..940c266 100644 --- a/views/settingsDialog.py +++ b/views/settingsDialog.py @@ -100,6 +100,7 @@ def InstallControls(self): self.language, static = creator.combobox(_("言語(&L)"), list(self.languageSelection.values())) self.colormode, static = creator.combobox(_("画面表示モード(&D)"), list(self.colorModeSelection.values())) self.textwrapping, static = creator.combobox(_("テキストの折り返し(&W)"), list(self.textWrappingSelection.values())) + self.enableMultiline = creator.checkbox(_("複数行の質問・回答を入力可能にする")) # network creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,wx.VERTICAL,space=20,label=_("ネットワーク"),style=wx.ALL,margin=20) @@ -132,6 +133,7 @@ def load(self): self._setValue(self.language,"general","language",configType.DIC,self.languageSelection) self._setValue(self.colormode,"view","colormode",configType.DIC,self.colorModeSelection) self._setValue(self.textwrapping,"view","textwrapping",configType.DIC,self.textWrappingSelection) + self._setValue(self.enableMultiline,"view","enableMultiline",configType.BOOL,False) # network self._setValue(self.update, "general", "update", configType.BOOL) From 04c05645a47d8d90550e623ed1d2045ad6833804 Mon Sep 17 00:00:00 2001 From: yamahubuki Date: Sat, 21 Jan 2023 13:48:18 +0900 Subject: [PATCH 06/15] =?UTF-8?q?=E3=83=AC=E3=82=A4=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- views/settingsDialog.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/views/settingsDialog.py b/views/settingsDialog.py index 940c266..8f47b5e 100644 --- a/views/settingsDialog.py +++ b/views/settingsDialog.py @@ -92,15 +92,14 @@ def InstallControls(self): self.loginAlways = creator.checkbox(_("ログインした状態で質問する")) creator.GetSizer().SetItemSpan(self.loginAlways.GetParent(),2) - - - # view creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,views.ViewCreator.GridBagSizer,label=_("表示/言語"),style=wx.ALL,margin=20) self.language, static = creator.combobox(_("言語(&L)"), list(self.languageSelection.values())) self.colormode, static = creator.combobox(_("画面表示モード(&D)"), list(self.colorModeSelection.values())) self.textwrapping, static = creator.combobox(_("テキストの折り返し(&W)"), list(self.textWrappingSelection.values())) self.enableMultiline = creator.checkbox(_("複数行の質問・回答を入力可能にする")) + creator.GetSizer().SetItemSpan(self.enableMultiline.GetParent(), 2) + # network creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,wx.VERTICAL,space=20,label=_("ネットワーク"),style=wx.ALL,margin=20) From 15275fad53d6a43bfd0b28169905203ecd847270 Mon Sep 17 00:00:00 2001 From: yamahubuki Date: Sat, 21 Jan 2023 15:28:55 +0900 Subject: [PATCH 07/15] =?UTF-8?q?=E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E3=83=90=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/history.txt | 5 +++-- views/main.py | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/public/history.txt b/public/history.txt index 49c0197..caf238c 100644 --- a/public/history.txt +++ b/public/history.txt @@ -1,7 +1,8 @@ windows Native Peing Connector(NPC) 更新履歴 -2022/02/02 Version 1.3.2 -1. リスト上の項目を選択していない状態でソフトウェアを終了しようとした場合、エラーとなってしまう不具合を修正しました。 +2022/02/02 Version 1.4.0 +1. メインウィンドウにステータスバーを追加しました。表示中の質問の数と、現在のカーソル位置が表示されます。 +2. リスト上の項目を選択していない状態でソフトウェアを終了しようとした場合、エラーとなってしまう不具合を修正しました。 2022/02/02 Version 1.3.1 1. 回答者がPeingIDを変更したことをNPCが検知した後で変更後のPeingIdをNPCに登録しようとした場合に、既に登録されているというエラーが表示されていた不具合を修正しました。 diff --git a/views/main.py b/views/main.py index 9ecb36f..90e8f61 100644 --- a/views/main.py +++ b/views/main.py @@ -70,8 +70,11 @@ def __init__(self): self.lst.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.events.listActivated) self.lst.Bind(wx.EVT_LIST_ITEM_SELECTED, self.events.listSelectEvent) self.lst.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.events.listSelectEvent) + self.lst.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.events.updateFocus) self.events.listSelectEvent() #最初に1度実行し、未選択状態をメニューに反映 + self.hFrame.CreateStatusBar() + self.hFrame.Bind(wx.EVT_MENU_OPEN, self.events.OnMenuOpen) self.refresh() @@ -703,3 +706,9 @@ def loginCheck(self): return False return True + def updateFocus(self, event): + if event.GetIndex(): + self.parent.hFrame.SetStatusText(_("%d個中%d個目を選択中" % (self.parent.lst.GetItemCount(), event.GetIndex()))) + else: + self.parent.hFrame.SetStatusText(_("%d個表示中、選択項目なし" % self.parent.lst.GetItemCount())) + From 9706bcdbc3e2028aa19184b4c0c655e4ae1cf5bd Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sun, 22 Jan 2023 09:19:14 +0900 Subject: [PATCH 08/15] =?UTF-8?q?simpleInputDialog=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20fixed=20#34?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- views/SimpleInputDialog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index 62aab06..dbde460 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -43,9 +43,9 @@ def InstallControls(self): def ok(self,event): if self.validationPattern: - if not re.fullmatch(self.validationPattern,self.edit.GetLineText(0)): + if not re.fullmatch(self.validationPattern,self.edit.GetValue()): return event.Skip() def GetData(self): - return self.edit.GetLineText(0) + return self.edit.GetValue() From 712ba79161941c46a1f10113cbc7ec96190fe6d8 Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sun, 23 Apr 2023 12:23:58 +0900 Subject: [PATCH 09/15] Fix validation logic --- views/SimpleInputDialog.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index dbde460..9abdb54 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -42,10 +42,17 @@ def InstallControls(self): self.bCancel=self.creator.cancelbutton(_("キャンセル"),None) def ok(self,event): - if self.validationPattern: - if not re.fullmatch(self.validationPattern,self.edit.GetValue()): - return + if not self.validate(): + return event.Skip() def GetData(self): return self.edit.GetValue() + + def validate(self): + if self.validationPattern: + pattern = re.compile(self.validationPattern) + for line in self.edit.GetValue().splitlines(): + if len(line.strip()) > 0 and not re.match(pattern, line): + return False + return True From 94112e2ee3cf6f0ac6e243759ff56cede0c703e7 Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sun, 23 Apr 2023 17:53:25 +0900 Subject: [PATCH 10/15] add mode parameter to simpleInputDialog --- views/SimpleInputDialog.py | 39 ++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index 9abdb54..a27bfc0 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -3,6 +3,7 @@ # Copyright (C) 2019-2020 yamahubuki # Note: All comments except these top lines will be written in Japanese. +import enum import re import wx @@ -10,11 +11,23 @@ from logging import getLogger from views.baseDialog import * +import simpleDialog DEFAULT_STYLE=wx.BORDER_RAISED|wx.TE_DONTWRAP +# 入力値のバリデーション、値の返却のモード +class Mode(enum.Enum): + # 空行を飛ばしつつ、1行ずつバリデーション + # パターンにマッチしない行が1行でもあればinvalid + # 返却時は、空行を除く各行のデータを改行コードで繋いで返す + EACH_LINE = enum.auto() + # 入力値全体がパターンとマッチするかを調べる + # 返却時は、入力されたデータを加工せずに返す + WHOLE = enum.auto() + + class Dialog(BaseDialog): - def __init__(self,title,detail,parent=None,validationPattern=None,defaultValue="",style=0): + def __init__(self,title,detail,parent=None,validationPattern=None,defaultValue="",style=0,mode=Mode.EACH_LINE): super().__init__("SimpleInputDialog") self.title=title self.detail=detail @@ -25,6 +38,7 @@ def __init__(self,title,detail,parent=None,validationPattern=None,defaultValue=" self.parent=self.app.hMainView.hFrame self.validationPattern = validationPattern self.style=style + self.mode=mode def Initialize(self): super().Initialize(self.parent,self.title) @@ -47,12 +61,29 @@ def ok(self,event): event.Skip() def GetData(self): - return self.edit.GetValue() + if self.mode == Mode.EACH_LINE: + ret = [] + for line in self.edit.GetValue().splitlines(): + line = line.strip() + if len(line) == 0: + continue + ret.append(line) + return "\n".join(ret) + elif self.mode == Mode.WHOLE: + return self.edit.GetValue() def validate(self): if self.validationPattern: pattern = re.compile(self.validationPattern) - for line in self.edit.GetValue().splitlines(): - if len(line.strip()) > 0 and not re.match(pattern, line): + if self.mode == Mode.EACH_LINE: + lineNum = 0 + for line in self.edit.GetValue().splitlines(): + lineNum += 1 + if len(line.strip()) > 0 and not re.fullmatch(pattern, line): + simpleDialog.errorDialog(_("入力内容に誤りがあります。") + "\n" + _("行: %d") % lineNum, self.wnd) + return False + elif self.mode == Mode.WHOLE: + if not re.fullmatch(pattern, self.edit.GetValue()): + simpleDialog.errorDialog(_("入力内容に誤りがあります。"), self.wnd) return False return True From 2c533158db44c68d041652a85fd0eaa603002855 Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sun, 23 Apr 2023 18:09:24 +0900 Subject: [PATCH 11/15] Trim whitespace before validation --- views/SimpleInputDialog.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index a27bfc0..1281196 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -79,7 +79,8 @@ def validate(self): lineNum = 0 for line in self.edit.GetValue().splitlines(): lineNum += 1 - if len(line.strip()) > 0 and not re.fullmatch(pattern, line): + line = line.strip() + if len(line) > 0 and not re.fullmatch(pattern, line): simpleDialog.errorDialog(_("入力内容に誤りがあります。") + "\n" + _("行: %d") % lineNum, self.wnd) return False elif self.mode == Mode.WHOLE: From a78ddaebd325dd280e9cfca481d7460c50245735 Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sun, 23 Apr 2023 18:15:35 +0900 Subject: [PATCH 12/15] remove `wx.TE_DONTWRAP` from `DEFAULT_STYLE` --- views/SimpleInputDialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index 1281196..e7c0d04 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -13,7 +13,7 @@ from views.baseDialog import * import simpleDialog -DEFAULT_STYLE=wx.BORDER_RAISED|wx.TE_DONTWRAP +DEFAULT_STYLE=wx.BORDER_RAISED # 入力値のバリデーション、値の返却のモード class Mode(enum.Enum): From 926c525f21c149678d8c982e09941c36e980d4b6 Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sun, 23 Apr 2023 18:32:35 +0900 Subject: [PATCH 13/15] must have one or more available values in `EACH_LINE` mode --- views/SimpleInputDialog.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index e7c0d04..aca1e62 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -76,13 +76,21 @@ def validate(self): if self.validationPattern: pattern = re.compile(self.validationPattern) if self.mode == Mode.EACH_LINE: + exists = False lineNum = 0 for line in self.edit.GetValue().splitlines(): lineNum += 1 line = line.strip() - if len(line) > 0 and not re.fullmatch(pattern, line): + if len(line) == 0: + continue + if not re.fullmatch(pattern, line): simpleDialog.errorDialog(_("入力内容に誤りがあります。") + "\n" + _("行: %d") % lineNum, self.wnd) return False + # バリデーションに成功した + exists = True + if not exists: + simpleDialog.errorDialog(_("有効な値が入力されていません。"), self.wnd) + return False elif self.mode == Mode.WHOLE: if not re.fullmatch(pattern, self.edit.GetValue()): simpleDialog.errorDialog(_("入力内容に誤りがあります。"), self.wnd) From f4fb3ce4c070e97dc8bb64329f45d5a1ffc3c6c0 Mon Sep 17 00:00:00 2001 From: yamahubuki Date: Sat, 29 Apr 2023 23:37:30 +0900 Subject: [PATCH 14/15] 1.4.0 update --- ConfigManager.py | 9 +--- constants.py | 4 +- menuItemsDic.py | 2 +- public/history.txt | 4 +- public/readme.txt | 32 ++++---------- service.py | 19 +-------- twitterLogin.py | 65 ---------------------------- twitterService.py | 95 ----------------------------------------- version.json | 2 +- views/main.py | 58 ++++++++++--------------- views/settingsDialog.py | 6 --- 11 files changed, 39 insertions(+), 257 deletions(-) delete mode 100644 twitterLogin.py delete mode 100644 twitterService.py diff --git a/ConfigManager.py b/ConfigManager.py index bc9831a..90178ac 100644 --- a/ConfigManager.py +++ b/ConfigManager.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- #ConfigManager -#Copyright (C) 2019-2022 yamahubuki +#Copyright (C) 2019-2020 yamahubuki import os import configparser @@ -15,7 +15,6 @@ def __init__(self): self.identifier="ConfigManager" self.log=getLogger(self.identifier) self.log.debug("Create config instance") - self.fileName = None def read(self,fileName): self.fileName=fileName @@ -54,12 +53,6 @@ def write(self): self.log.error("save failed.") return errorCodes.ACCESS_DENIED - def getFileName(self): - return self.fileName - - def getAbsFileName(self): - return os.path.abspath(self.fileName) - def __getitem__(self,key): try: return ConfigSection(super().__getitem__(key)) diff --git a/constants.py b/constants.py index a503898..ef77f19 100644 --- a/constants.py +++ b/constants.py @@ -9,8 +9,8 @@ APP_FULL_NAME = "windows Native Peing Connector"#アプリケーションの完全な名前 APP_NAME="NPC"#アプリケーションの名前 APP_ICON = None -APP_VERSION="1.3.2" -APP_LAST_RELEASE_DATE="2022-02-02" +APP_VERSION="1.4.0" +APP_LAST_RELEASE_DATE="2023-04-29" APP_COPYRIGHT_YEAR="2021" APP_LICENSE="Apache License 2.0" APP_DEVELOPERS="yamahubuki, ACT Laboratory" diff --git a/menuItemsDic.py b/menuItemsDic.py index 13cbced..4d2df34 100644 --- a/menuItemsDic.py +++ b/menuItemsDic.py @@ -21,7 +21,7 @@ def getValueString(ref_id): "FILE_EXPORT":_("表示中のリスト内容をCSVファイルにエクスポート(&E)"), "FILE_SHOW_USER_WEB":_("ブラウザでユーザのページを開く(&B)"), "FILE_USER_LIST":_("登録済みユーザリスト(&L)")+"...", - "FILE_ADD_USER_FROM_TWITTER_FOLLOW_LIST":_("Twitterのフォローリストから一括登録"), + "FILE_ADD_USER_FROM_TWITTER_FOLLOW_LIST":_("ユーザの一括追加"), "FILE_EXIT":_("終了(&X)"), "FILTER_AUTO_QUESTION":_("運営からの質問を非表示(&M)"), diff --git a/public/history.txt b/public/history.txt index 6e1caa0..9503a25 100644 --- a/public/history.txt +++ b/public/history.txt @@ -1,8 +1,10 @@ windows Native Peing Connector(NPC) 更新履歴 -2023/XX/XX Version 1.4.0 +2023/04/29 Version 1.4.0 1. メインウィンドウにステータスバーを追加しました。表示中の質問の数と、現在のカーソル位置が表示されます。 2. オプション設定に、複数行の質問・回答を入力可能にするかどうかの設定を追加しました。 +3. TwitterIDでのログイン機能を廃止しました。 +4. Twitterでフォローしているユーザーの一覧を基にアカウントを一括追加する機能を廃止し、代わりに複数アカウントをまとめて入力・追加できる機能をつけました。 2022/02/02 Version 1.3.2 1. リスト上の項目を選択していない状態でソフトウェアを終了しようとした場合、エラーとなってしまう不具合を修正しました。 diff --git a/public/readme.txt b/public/readme.txt index 04273f1..7517d94 100644 --- a/public/readme.txt +++ b/public/readme.txt @@ -1,7 +1,7 @@ windows Native Peing Connector -NPC- - バージョン:  ver.1.3.2 - リリース:   2022-02-02 + バージョン:  ver.1.4.0 + リリース:   2023-04-29 開発・配布元: ACT Laboratory (https://actlab.org/) 主要開発者:  吹雪   ソフト種別:  オープンソースソフトウェア (GitHubリポジトリ:https://github.com/actlaboratory/NPC/) @@ -132,23 +132,9 @@ NPCからの回答の取得や質問の投稿がうまくいかない際には [絞り込み]エディットボックスにアカウント名または表示名の一部、もしくは@に続けてアカウント名の先頭部分を入力すると、表示するアカウントを絞り込むことができます。 リストビューの上でコンテキストメニューを表示すると、各ボタンと同じ操作を行うことができます。また、リスト上の2つのカラムの表示順序を入れ替えることができます。なお、この並び替えを行った際にPC-Talkerでの読み上げがおかしくなった場合は、一旦ダイアログを閉じてから開き直してください。リストの順序は保存されます。 -4.1.10 Twitterのフォローリストから一括登録 -短文投稿SNSのTwitterにおいて指定したユーザがフォローしているユーザのリストを取得し、リスト内のアカウントを回答の閲覧対象として追加登録します。 -この機能は、多くのユーザがTwitterからの連携によりPeingに登録し、PeingIDとTwitterのアカウント名が一致していることに着目して作られたものです。 -そのため、指定したアカウントがフォローしているユーザのPeingアカウントが登録されなかったり、逆に関係のないアカウントが登録されてしまったりする場合があります。 -登録前には最終確認のダイアログを表示しますので、必ず内容を確認してから実行してください。 - -この機能を利用するには、利用者がTwitterのアカウントを所有している必要があります。 -また、Twitterの通信制限の為、この機能を連続して利用する場合、必ず15分間以上時間を空ける必要があります。 - -この項目を選択すると、ブラウザが起動し、Twitterへのログインを求められます。 -ブラウザを操作し、TwitterのIDとパスワードを入力してください。 -もし、入力後に「このブラウザは現在サポートされていません。」という画面が表示された場合には、IDまたはパスワードが間違っていますので、[Alt+左カーソル]等の操作で前の画面に戻り、再度入力してください。 -入力に成功すると、NPCに対してアカウントの利用を許可するか否かを問う画面が表示されます。内容を確認後、許可の操作を行ってください。 -利用しているブラウザによっては、この後にセキュリティの警告などが2度程度表示される場合がありますが、問題のないものですので[はい]を押してください。 - -すべての操作が終了後、NPCに戻ると、[対象ユーザの指定]というダイアログボックスが表示されますので、フォローリストを取得したいユーザのアカウント(@guredora403のような半角英数と_のみで構成された@で始まる文字列)を入力し、[OK]を押してください。 -ここで指定できるアカウントは、先の手順でログインに用いたアカウント、公開アカウント、もしくは先の手順でログインに用いたアカウントからフォローしている非公開アカウントのいずれかであり、フォロー数が3,000未満のものに限られます。フォロー数3,000超のアカウントを指定した場合、リスト内の3,000件のみが取得されます。 +4.1.10 ユーザの一括追加 +複数のユーザを一括で追加することができます。 +画面の指示に従い、追加したいユーザのアカウントを下位行区切りで入力してください。 入力後は、リストの取得などのため、しばらく時間がかかります。 通信が完了すると、[登録候補ユーザの確認]ダイアログボックスが表示されます。ここには、指定したユーザがフォローしており、かつNPCに登録されていないアカウントが一覧表示されています。 @@ -260,13 +246,11 @@ NPCを起動すると、インストール先フォルダに「npc.log」とい ログイン機能の利用には、幾つかの注意事項があります。5.1の内容をお読みになったうえで使用してください。 4.4.1.2.1 利用するIDの種類 -Peingへのログインに用いるアカウントをTwitterIDまたはPeingIDから選択することができます。 -なお、両方のIDで同じアカウントにログインできる方は、動作速度や安定性の観点からPeingログインの設定を推奨します。 - +Peingへのログインに用いるアカウントをTwitterIDまたはPeingIDから選択することができる機能でしたが、TwitterIDでのログイン機能は廃止されました。 4.4.1.2.2 ID ログインが必要な機能を利用する際に用いるPeingアカウントのIDを設定します。 -前の項目で設定した種類のIDまたは登録メールアドレスを入力します。 +PeingIDまたは登録メールアドレスを入力します。 入力したIDを用いてPeingにログインしたことがある必要があります。NPCは初回ログインおよびIDの新規登録には利用できません。 なお、Twitterからの連携でPeingアカウントを作成した場合のPeingIDは、Twitterのアカウント名の先頭の@を消し、全ての英字を小文字にしたものとなります。 設定を解除する場合には、IDと次の項目で詳述するパスワードを両方とも空欄としてください。 @@ -274,7 +258,7 @@ Peingへのログインに用いるアカウントをTwitterIDまたはPeingID 4.4.1.2.3 パスワード IDと併せてPeingのログインに用いるパスワードを設定します。 なお、Twitterを含むSNSからの連携でPeingアカウントを作成した場合には、PeingIDのパスワードが設定されていない状態となります(2021年4月現在)。 -その場合には、ここで設定を行う前に、ウェブや公式アプリからPeingにログインしてパスワードの設定を行うか、Twitter連携で登録された場合にはTwitterIDによるログインをお試しください。 +その場合には、ここで設定を行う前に、ウェブや公式アプリからPeingにログインしてパスワードの設定を行ってください。 設定を解除する場合には、IDとパスワードを両方とも空欄としてください。 4.4.1.2.4 ログインした状態で質問する diff --git a/service.py b/service.py index 4593e2e..84385ad 100644 --- a/service.py +++ b/service.py @@ -8,7 +8,6 @@ import errorCodes import entity.user import entity.answer -import twitterLogin import peing import views.main @@ -288,23 +287,7 @@ def login(self,idType,id,pw,force=False): self.log.error(e) return errorCodes.LOGIN_PEING_ERROR else: - try: - self.log.info("login with twitter") - session = twitterLogin.login(id,pw) - if type(session) == int: - self.log.error("login failed. code="+str(session)) - return session - self.log.debug("try to get userId") - self.selfId = self.getSelfId(session) - if type(self.selfId)!=str: - self.log.error("getSelfId() failed. code="+str(self.selfId)) - return self.selfId - self.log.info("twitter login succeseeded:"+self.selfId) - self.session = session - return errorCodes.OK - except Exception as e: - self.log.error(e) - return errorCodes.LOGIN_UNKNOWN_ERROR + return errorCodes.LOGIN_UNKNOWN_ERROR def getSelfId(self,session): try: diff --git a/twitterLogin.py b/twitterLogin.py deleted file mode 100644 index 04b67af..0000000 --- a/twitterLogin.py +++ /dev/null @@ -1,65 +0,0 @@ -# NPC Twitter login module -# Copyright (C) 2021 yamahubuki - -import errorCodes - -import requests -import urllib.parse - -from bs4 import BeautifulSoup - - -def getToken(session): - page = session.get("https://peing.net/ja/",timeout=5,verify=False) - soup = BeautifulSoup(page.content, "lxml") - form = soup.find("form", {"action":"/auth/twitter"}) - ret = form.find("input", {"name":"authenticity_token","type":"hidden"}) - return ret["value"] - -def login(id, password): - session = requests.Session() - try: - data = { - "authenticity_token": getToken(session) - } - except: - return errorCodes.LOGIN_PEING_ERROR - - headers = { - "Accept-Language": "ja-JP", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", - "Content-Type": "application/x-www-form-urlencoded", - } - ret = session.post("https://peing.net/auth/twitter",headers=headers,data=data,timeout=5,verify=False) - if not ret.url.startswith("https://api.twitter.com/oauth/authenticate?"): - return errorCodes.LOGIN_PEING_ERROR - - soup = BeautifulSoup(ret.content, "lxml") - headers = { - } - data = { - "authenticity_token": soup.find("input", {"name":"authenticity_token","type":"hidden"})["value"], - "redirect_after_login": soup.find("input", {"name":"redirect_after_login","type":"hidden"})["value"], - "oauth_token": soup.find("input", {"name":"oauth_token","type":"hidden"})["value"], - "session[username_or_email]": id, - "session[password]": password - } - - ret = session.post("https://api.twitter.com/oauth/authenticate",headers=headers,data=data,timeout=5,verify=False) - if ret.url.startswith("https://twitter.com/login/error?"): - return errorCodes.LOGIN_WRONG_PASSWORD - elif ret.url.startswith("https://twitter.com/account/access") or ret.url.startswith("https://twitter.com/login"): - return errorCodes.LOGIN_RECAPTCHA_NEEDED - elif not ret.url.startswith("https://api.twitter.com/oauth/authenticate"): - return errorCodes.LOGIN_TWITTER_ERROR - - try: - soup = BeautifulSoup(ret.content, "lxml") - url = soup.find("meta",{"http-equiv":"refresh"})["content"][6:] - except: - return errorCodes.LOGIN_CONFIRM_NEEDED - - if not url.startswith("https://peing.net/auth/twitter/callback"): - return errorCodes.LOGIN_TWITTER_ERROR - session.get(url) - return session diff --git a/twitterService.py b/twitterService.py deleted file mode 100644 index 6909f0f..0000000 --- a/twitterService.py +++ /dev/null @@ -1,95 +0,0 @@ -# npc service -# Copyright (C) 2021 yamahubuki - -import os -import time -import tweepy -import twitterAuthorization -import webbrowser -import wx - -import constants -import errorCodes - -from logging import getLogger - - -log = getLogger("%s.twitterService" % (constants.LOG_PREFIX)) - - -# ブラウザを起動し、ユーザからの認証を受ける -# 途中、Bool値を返すpollingFunctionを呼び続け、Falseが返却された場合は強制的に終了する -# 成功時はトークン(dic)、失敗時はNoneを返す -def authorize(pollingFunction=None): - manager = None - try: - log.debug("start authorization") - manager = twitterAuthorization.TwitterAuthorization(constants.TWITTER_CONSUMER_KEY,constants.TWITTER_CONSUMER_SECRET,constants.LOCAL_SERVER_PORT) - l="ja" - try: - l=globalVars.app.config["general"]["language"].split("_")[0].lower() - except: - pass#end うまく読めなかったら ja を採用 - #end except - manager.setMessage( - lang=l, - success=_("認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってください。"), - failed=_("認証に失敗しました。もう一度お試しください。"), - transfer=_("しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。") - ) - url = manager.getUrl() - log.debug("url = %s" % url) - webbrowser.open(url, new=1, autoraise=True) - - # polling - while(True): - wx.YieldIfNeeded() - - # return tupple, "" or None - token=manager.getToken() - if token=="": - log.info("Authorization failed. May be user disagreed.") - token = None - break - elif token: - break - elif pollingFunction()==False: - token = errorCodes.CANCELED - log.info("pollingFunction returned False") - break - # when token==None: continue polling - - manager.shutdown() - return token - except Exception as e: - log.error(e) - if manager: - manager.shutdown() - return None - -def getFollowList(token,target): - auth = tweepy.OAuthHandler(constants.TWITTER_CONSUMER_KEY, constants.TWITTER_CONSUMER_SECRET) - auth.set_access_token(*token) - try: - twitterApi = tweepy.API(auth,proxy=os.environ['HTTPS_PROXY']) - except KeyError: - twitterApi = tweepy.API(auth) - - ret = [] - try: - user = twitterApi.get_user(screen_name=target) - friendsCount = user.friends_count - friends = tweepy.Cursor(twitterApi.get_friends,screen_name=target,include_user_entities=False,skip_status=True,count=200).items() - for friend in friends: - ret.append(friend.screen_name) - return ret - except tweepy.TooManyRequests: - log.error("rateLimitError") - return ret - except tweepy.TweepyException as e: - log.error(e) - log.error("%s" %(e.response)) - return errorCodes.TWITTER_ERROR - except Exception as e: - log.error(e) - return errorCodes.UNKNOWN diff --git a/version.json b/version.json index a0404dc..2ca1a1c 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{"version": "1.3.2", "release_date": "2022-02-02"} \ No newline at end of file +{"version": "1.4.0", "release_date": "2023-04-29"} \ No newline at end of file diff --git a/views/main.py b/views/main.py index 5e28695..9b0ed10 100644 --- a/views/main.py +++ b/views/main.py @@ -17,7 +17,6 @@ import globalVars import menuItemsStore import service -import twitterService import update from .base import * @@ -286,46 +285,33 @@ def OnMenuSelect(self,event): if selected==menuItemsStore.getRef("FILE_ADD_USER_FROM_TWITTER_FOLLOW_LIST"): self.log.debug("addListFromTwitterUser:start") + + # ダイアログ表示用パラメータ + title = _("対象ユーザの指定") + msg = _("対象アカウントの@からはじまるアカウント名を、\n改行区切りで入力してください。") + pattern = "^(@?[a-zA-Z0-9_]*)$" + style = wx.TE_MULTILINE + d = views.SimpleInputDialog.Dialog(title, msg, validationPattern=pattern, style=style) + d.Initialize() + d.edit.SetMinSize((-1,200)) + if d.Show() == wx.ID_CANCEL: + return + # 改行区切りの文字列 + users = d.GetValue() + users = users.split("\n") + # 先頭の'@'があれば削除 + for i in range(len(users)): + if users[i][0] == "@": + users[i] = users[i][1:] + d=progress.Dialog() - d.Initialize(_("Twitterアカウントの認証のため、ブラウザの操作を待っています。")+"...",_("Twitterのフォローリストから一括登録")) + d.Initialize(_("登録済みユーザのリストを取得しています。")+"...",_("ユーザの一括追加")) d.gauge.Hide() d.Show(modal=False) self.parent.hFrame.Disable() - token = twitterService.authorize(d.isOk) - if token == None: - errorDialog(_("Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、またはインターネット接続に問題がある可能性があります。"),d.wnd) - if token == None or token == errorCodes.CANCELED: - self.parent.hFrame.Enable() - d.Destroy() - return - - d2 = SimpleInputDialog.Dialog(_("対象ユーザの指定"),_("フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してください。\n後悔アカウント、認証に用いたアカウント、\nまたは認証に用いたアカウントがフォローしている非公開アカウントを指定できます。"),d.wnd,"^(@?[a-zA-Z0-9_]*)$") - d2.Initialize() - r = d2.Show() - if r==wx.ID_CANCEL: - self.parent.hFrame.Enable() - d.Destroy() - return - #先頭の@はいらないので対策。入力時はあってもなくても良い - target = re.sub("@?(.*)","\\1", d2.GetValue()) - self.log.debug("target=%s" % target) - - d.update(label=_("フォローリストを取得しています。")+"...") - followList = twitterService.getFollowList(token,target) - if type(followList)==int: - if followList == errorCodes.TWITTER_ERROR: - errorDialog(_("Twitterからフォローリストを取得できませんでした。指定したユーザが存在しないか、フォローしていない非公開アカウントである可能性があります。"),d.wnd) - else: - errorDialog(_("Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試しください。状況が改善しない場合には、開発者までお問い合わせください。"),d.wnd) - self.parent.hFrame.Enable() - d.Destroy() - return - if len(followList)==0: - errorDialog(_("Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないアカウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待ってから再度お試しください。"),d.wnd) - follows=set(followList) + follows=set(users) - d.update(label=_("登録済みユーザのリストを取得しています。")+"...") userList = self.parent.service.getEnableUserList() users = set() if type(users)==int: @@ -699,7 +685,7 @@ def loginCheck(self): return False ret = self.parent.service.login( - self.parent.app.config.getint("account","id_type",constants.LOGIN_PEING,0,1), + constants.LOGIN_PEING, self.parent.app.config.getstring("account","id"), self.parent.app.config.getstring("account","password") ) diff --git a/views/settingsDialog.py b/views/settingsDialog.py index 8f47b5e..704ee3d 100644 --- a/views/settingsDialog.py +++ b/views/settingsDialog.py @@ -30,10 +30,6 @@ class Dialog(BaseDialog): # "NVDA": "NVDA", # "JAWS": "JAWS for Windows" #} - loginTypeSelection = { - str(constants.LOGIN_PEING):"PeingID", - str(constants.LOGIN_TWITTER):"TwitterID" - } logLevelSelection = { "50":"CRITICAL", "40":"ERROR", @@ -84,7 +80,6 @@ def InstallControls(self): # login creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,views.ViewCreator.GridBagSizer,label=_("ログイン"),style=wx.ALL,margin=20) - self.loginType,dummy = creator.combobox(_("利用するIDの種類"),list(self.loginTypeSelection.values())) self.id,dummy = creator.inputbox("&ID",sizerFlag=wx.EXPAND) self.id.hideScrollBar(wx.HORIZONTAL) self.password,dummy = creator.inputbox(_("パスワード(&P)"),x=400,style=wx.TE_PASSWORD,sizerFlag=wx.EXPAND) @@ -123,7 +118,6 @@ def load(self): self._setValue(self.logLevel,"general","log_level",configType.DIC,self.logLevelSelection) # login - self._setValue(self.loginType,"account","id_type",configType.DIC,self.loginTypeSelection,constants.LOGIN_PEING) self._setValue(self.id,"account","id",configType.STRING,"") self._setValue(self.password,"account","password",configType.STRING,"") self._setValue(self.loginAlways,"account","use_always",configType.BOOL,False) From f29e68ce7a6043373659a664b5518e03a6c8c01e Mon Sep 17 00:00:00 2001 From: Kazto Kitabatake Date: Sat, 29 Apr 2023 23:47:21 +0900 Subject: [PATCH 15/15] update translation --- locale/en-us/LC_MESSAGES/messages.mo | Bin 31627 -> 29837 bytes locale/en-us/LC_MESSAGES/messages.po | 396 +++++++++++++++------------ locale/ja-jp/LC_MESSAGES/messages.po | 292 ++++++++++---------- locale/messages.po | 292 ++++++++++---------- 4 files changed, 497 insertions(+), 483 deletions(-) diff --git a/locale/en-us/LC_MESSAGES/messages.mo b/locale/en-us/LC_MESSAGES/messages.mo index b53d49627c706745c7f00e96e93bb3a360562715..46d6203dcb5258c393c7b902cdc9659e2c255f3d 100644 GIT binary patch delta 6283 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 hhvtWcF^Ii_E%Q>v&>!j=6{P|HMIZ$ delta 7689 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\n" "Language-Team: LANGUAGE \n" @@ -17,12 +17,28 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AppBase.py:45 +#: app.py:82 views\main.py:677 +msgid "" +"設定の保存に失敗しました。下記のファイルへのアクセスが可能であることを確認し" +"てください。" +msgstr "" + +#: AppBase.py:48 msgid "" "ログ機能の初期化に失敗しました。下記のファイルへのアクセスが可能であることを" "確認してください。" msgstr "" +#: AppBase.py:57 +msgid "音声エンジンエラー" +msgstr "" + +#: AppBase.py:57 +msgid "" +"音声読み上げ機能の初期化に失敗したため、読み上げ機能を使用できません。出力先" +"の変更をお試しください。" +msgstr "" + #: keymapHandlerBase.py:696 keymapHandlerBase.py:726 #, python-format msgid "%s は存在しないキーです。" @@ -97,8 +113,8 @@ msgstr "" msgid "登録済みユーザリスト(&L)" msgstr "" -#: menuItemsDic.py:24 views\main.py:290 -msgid "Twitterのフォローリストから一括登録" +#: menuItemsDic.py:24 views\main.py:308 +msgid "ユーザの一括追加" msgstr "" #: menuItemsDic.py:25 @@ -179,21 +195,6 @@ msgstr "" msgid "列の並び替え(&R)" msgstr "" -#: twitterService.py:36 -msgid "" -"認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってくださ" -"い。" -msgstr "" - -#: twitterService.py:37 -msgid "認証に失敗しました。もう一度お試しください。" -msgstr "" - -#: twitterService.py:38 -msgid "" -"しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。" -msgstr "" - #: update.py:50 update.py:59 update.py:73 update.py:79 update.py:90 #: update.py:98 update.py:103 update.py:108 update.py:160 #: views\updateDialog.py:39 @@ -274,7 +275,7 @@ msgid "受信しない" msgstr "" #: views\accountSettingsDialog.py:34 views\globalKeyConfig.py:75 -#: views\settingsDialog.py:61 +#: views\settingsDialog.py:57 msgid "設定" msgstr "" @@ -318,19 +319,19 @@ msgstr "" msgid "アーカイブ済みの質問" msgstr "" -#: views\answerDialog.py:87 +#: views\answerDialog.py:90 msgid "回答の入力" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答完了" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答が送信されました。" msgstr "" -#: views\answerDialog.py:96 +#: views\answerDialog.py:99 msgid "" "指定された質問が存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -342,11 +343,11 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 msgid "質問をアーカイブ" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 #, python-format msgid "" "以下の質問をアーカイブしますか?\n" @@ -354,11 +355,11 @@ msgid "" "%s" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 msgid "質問を元に戻す" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 #, python-format msgid "" "以下の質問を元に戻しますか?\n" @@ -408,12 +409,12 @@ msgstr "" #: views\candidateUserListDialog.py:48 views\KeyValueSettingDialogBase.py:84 #: views\KeyValueSettingDialogBase.py:275 views\listConfigurationDialog.py:60 -#: views\searchConditionDialog.py:38 views\settingsDialog.py:115 -#: views\SimpleInputDialog.py:40 views\updateDialog.py:45 +#: views\searchConditionDialog.py:38 views\settingsDialog.py:110 +#: views\SimpleInputDialog.py:56 views\updateDialog.py:45 msgid "キャンセル" msgstr "" -#: views\candidateUserListDialog.py:63 views\main.py:240 +#: views\candidateUserListDialog.py:63 views\main.py:239 #: views\userListDialog.py:79 msgid "ユーザの削除" msgstr "" @@ -464,7 +465,7 @@ msgstr "" msgid "識別子" msgstr "" -#: views\globalKeyConfig.py:31 views\main.py:489 +#: views\globalKeyConfig.py:31 views\main.py:475 msgid "ショートカットキーの設定" msgstr "" @@ -473,7 +474,7 @@ msgstr "" #: views\globalKeyConfig.py:120 views\globalKeyConfig.py:128 #: views\globalKeyConfig.py:138 views\globalKeyConfig.py:143 #: views\keyConfig.py:57 views\KeyValueSettingDialogBase.py:333 -#: views\main.py:667 views\main.py:680 +#: views\main.py:659 views\main.py:672 msgid "なし" msgstr "" @@ -513,7 +514,7 @@ msgstr "" msgid "このショートカットは変更できません。" msgstr "" -#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:477 +#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:463 msgid "設定完了" msgstr "" @@ -558,7 +559,7 @@ msgstr "" #: views\KeyValueSettingDialogBase.py:83 views\KeyValueSettingDialogBase.py:274 #: views\listConfigurationDialog.py:59 views\searchConditionDialog.py:37 -#: views\SimpleInputDialog.py:39 +#: views\SimpleInputDialog.py:55 msgid "OK" msgstr "" @@ -632,43 +633,39 @@ msgstr "" msgid "全ての列を非表示にすることはできません。" msgstr "" -#: views\main.py:181 +#: views\main.py:184 msgid "ファイル(&F)" msgstr "" -#: views\main.py:182 +#: views\main.py:185 msgid "フィルタ(&I)" msgstr "" -#: views\main.py:183 +#: views\main.py:186 msgid "アカウント(&A)" msgstr "" -#: views\main.py:184 +#: views\main.py:187 msgid "オプション(&O)" msgstr "" -#: views\main.py:185 +#: views\main.py:188 msgid "ヘルプ(&H)" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "ユーザの追加" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "peingページURLまたはTwitterユーザ名" msgstr "" -#: views\main.py:211 -msgid "指定されたユーザは既に登録済みです。" -msgstr "" - -#: views\main.py:218 +#: views\main.py:216 msgid "ユーザ追加" msgstr "" -#: views\main.py:218 +#: views\main.py:216 #, python-format msgid "" "以下のユーザを追加しますか?\n" @@ -677,21 +674,17 @@ msgid "" "%(name)s(%(account)s)" msgstr "" -#: views\main.py:222 views\main.py:379 +#: views\main.py:221 views\main.py:365 msgid "登録完了" msgstr "" -#: views\main.py:222 +#: views\main.py:221 msgid "" "ユーザの登録に成功しました。今回登録したユーザの回答を表示するには、ビューを" "再読み込みしてください。" msgstr "" -#: views\main.py:225 -msgid "ユーザの登録に失敗しました。" -msgstr "" - -#: views\main.py:240 views\userListDialog.py:79 +#: views\main.py:239 views\userListDialog.py:79 #, python-format msgid "" "以下のユーザの登録と、過去の回答履歴を削除しますか?\n" @@ -699,78 +692,42 @@ msgid "" "%s" msgstr "" -#: views\main.py:253 +#: views\main.py:252 msgid "" "このユーザは既に退会したか、peingIDを変更しているため開くことができません。" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "出力先ファイルの指定" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "CSVファイル(*.csv) | *.csv; | すべてのファイル(*.*) | *.*" msgstr "" #: views\main.py:290 -msgid "Twitterアカウントの認証のため、ブラウザの操作を待っています。" -msgstr "" - -#: views\main.py:297 -msgid "" -"Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、" -"またはインターネット接続に問題がある可能性があります。" -msgstr "" - -#: views\main.py:303 msgid "対象ユーザの指定" msgstr "" -#: views\main.py:303 +#: views\main.py:291 msgid "" -"フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してく" -"ださい。\n" -"後悔アカウント、認証に用いたアカウント、\n" -"または認証に用いたアカウントがフォローしている非公開アカウントを指定できま" -"す。" +"対象アカウントの@からはじまるアカウント名を、\n" +"改行区切りで入力してください。" msgstr "" -#: views\main.py:314 -msgid "フォローリストを取得しています。" -msgstr "" - -#: views\main.py:318 -msgid "" -"Twitterからフォローリストを取得できませんでした。指定したユーザが存在しない" -"か、フォローしていない非公開アカウントである可能性があります。" -msgstr "" - -#: views\main.py:320 -msgid "" -"Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試し" -"ください。状況が改善しない場合には、開発者までお問い合わせください。" -msgstr "" - -#: views\main.py:325 -msgid "" -"Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないア" -"カウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待っ" -"てから再度お試しください。" -msgstr "" - -#: views\main.py:328 +#: views\main.py:308 msgid "登録済みユーザのリストを取得しています。" msgstr "" -#: views\main.py:340 +#: views\main.py:326 msgid "Peingへの登録状況を調べています。" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "通信エラー" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "" "Peingとの通信でエラーが発生しました。インターネット接続を確認し、しばらくたっ" "てから再度お試しください。状況が改善しない場合は、Twitterでのフォロー数が多す" @@ -780,25 +737,25 @@ msgid "" "あれば一覧が表示されます。" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "処理終了" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "一括登録を試みましたが、登録の候補となるユーザが見つかりませんでした。" msgstr "" -#: views\main.py:374 +#: views\main.py:360 msgid "指定されたユーザを登録しています。" msgstr "" -#: views\main.py:379 +#: views\main.py:365 msgid "" "ユーザの一括登録に成功しました。今回登録したユーザの回答を表示するには、" "ビューを再読み込みしてください。" msgstr "" -#: views\main.py:445 views\main.py:454 views\main.py:463 +#: views\main.py:431 views\main.py:440 views\main.py:449 msgid "" "質問の取得に失敗しました。以下の対処をお試しください。\n" "\n" @@ -807,7 +764,7 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:473 +#: views\main.py:459 msgid "" "ログインまたはアカウント設定の取得に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -819,23 +776,23 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:477 +#: views\main.py:463 msgid "設定しました。" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "準備中" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "回答データを取得しています" msgstr "" -#: views\main.py:568 +#: views\main.py:554 msgid "登録ユーザの更新除外について" msgstr "" -#: views\main.py:568 +#: views\main.py:554 #, python-format msgid "" "登録していた以下のユーザは、アカウント名が変更されたか、削除されました。その" @@ -847,24 +804,24 @@ msgid "" "該当ユーザ:%s" msgstr "" -#: views\main.py:593 +#: views\main.py:582 msgid "質問を投稿" msgstr "" -#: views\main.py:593 +#: views\main.py:582 #, python-format msgid "%sさんへの質問内容" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "投稿完了" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "質問を投稿しました。" msgstr "" -#: views\main.py:620 +#: views\main.py:609 msgid "" "指定されたユーザが存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -875,13 +832,13 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:622 +#: views\main.py:611 msgid "" "Twitterとの通信でエラーが発生しました。指定したユーザ名が間違っているか、イン" "ターネット接続に問題が発生した可能性があります。" msgstr "" -#: views\main.py:624 +#: views\main.py:613 msgid "" "ログインに失敗しました。設定されたアカウント情報に誤りがあります。\n" "\n" @@ -891,13 +848,13 @@ msgid "" "このメッセージと使用したIDの種類を添えて開発者までお問い合わせください。\n" msgstr "" -#: views\main.py:626 +#: views\main.py:615 msgid "" "ログインに失敗しました。ログインに際して権限の認可が要求されています。同じID" "でブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:628 +#: views\main.py:617 msgid "" "ログインに失敗しました。Peingのサーバやお使いのインターネット接続に障害が発生" "している可能性があります。ブラウザから同じIDでログインできるか確認してくださ" @@ -906,7 +863,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:630 +#: views\main.py:619 msgid "" "ログインに失敗しました。Twitterのサーバやお使いのインターネット接続に障害が発" "生している可能性があります。ブラウザから同じIDでログインできるか確認してくだ" @@ -915,7 +872,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:632 +#: views\main.py:621 msgid "" "不明なエラーの為、ログインに失敗しました。サイトの仕様変更や、お使いのイン" "ターネット接続の障害が考えられます。まずは、ブラウザから同じIDでログインでき" @@ -924,26 +881,40 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:634 +#: views\main.py:623 msgid "" "ログインに失敗しました。ログインに際してRECAPTCHA(ロボットでないことの確認)が" "要求されています。同じIDでブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:636 +#: views\main.py:625 +msgid "指定されたユーザは既に登録済みです。" +msgstr "" + +#: views\main.py:627 #, python-format msgid "" "不明なエラー%(code)dが発生しました。大変お手数ですが、本ソフトの実行ファイル" "のあるディレクトリに生成された%(log)sを添付し、作者までご連絡ください。" msgstr "" -#: views\main.py:691 +#: views\main.py:684 msgid "" "この機能を利用するには、ログインが必要です。\n" "[オプション]→[設定]にて、アカウント情報を設定してください。詳細は、readme.txt" "をご確認ください。" msgstr "" +#: views\main.py:700 +#, python-format +msgid "%d個中%d個目を選択中" +msgstr "" + +#: views\main.py:702 +#, python-format +msgid "%d個表示中、選択項目なし" +msgstr "" + #: views\progress.py:35 msgid "中止(&C)" msgstr "" @@ -988,107 +959,120 @@ msgstr "" msgid "詳細を表示(&D)" msgstr "" -#: views\settingsDialog.py:46 +#: views\settingsDialog.py:42 msgid "標準" msgstr "" -#: views\settingsDialog.py:47 +#: views\settingsDialog.py:43 msgid "ダーク" msgstr "" -#: views\settingsDialog.py:50 +#: views\settingsDialog.py:46 msgid "画面幅で折り返し" msgstr "" -#: views\settingsDialog.py:51 +#: views\settingsDialog.py:47 msgid "折り返さない" msgstr "" -#: views\settingsDialog.py:72 +#: views\settingsDialog.py:68 msgid "カテゴリ選択" msgstr "" -#: views\settingsDialog.py:75 +#: views\settingsDialog.py:71 msgid "一般" msgstr "" -#: views\settingsDialog.py:76 +#: views\settingsDialog.py:72 msgid "起動時に最新の情報を取得する" msgstr "" -#: views\settingsDialog.py:78 +#: views\settingsDialog.py:74 msgid "次回起動時にフィルタの状況を維持" msgstr "" -#: views\settingsDialog.py:80 +#: views\settingsDialog.py:76 msgid "次回起動時にカーソルの位置を復元" msgstr "" -#: views\settingsDialog.py:82 +#: views\settingsDialog.py:78 msgid "ログ記録レベル(&L)" msgstr "" -#: views\settingsDialog.py:86 +#: views\settingsDialog.py:82 msgid "ログイン" msgstr "" -#: views\settingsDialog.py:87 -msgid "利用するIDの種類" -msgstr "" - -#: views\settingsDialog.py:90 +#: views\settingsDialog.py:85 msgid "パスワード(&P)" msgstr "" -#: views\settingsDialog.py:92 +#: views\settingsDialog.py:87 msgid "ログインした状態で質問する" msgstr "" -#: views\settingsDialog.py:99 +#: views\settingsDialog.py:91 msgid "表示/言語" msgstr "" -#: views\settingsDialog.py:100 +#: views\settingsDialog.py:92 msgid "言語(&L)" msgstr "" -#: views\settingsDialog.py:101 +#: views\settingsDialog.py:93 msgid "画面表示モード(&D)" msgstr "" -#: views\settingsDialog.py:102 +#: views\settingsDialog.py:94 msgid "テキストの折り返し(&W)" msgstr "" -#: views\settingsDialog.py:105 +#: views\settingsDialog.py:95 +msgid "複数行の質問・回答を入力可能にする" +msgstr "" + +#: views\settingsDialog.py:100 msgid "ネットワーク" msgstr "" -#: views\settingsDialog.py:106 +#: views\settingsDialog.py:101 msgid "起動時に更新を確認(&U)" msgstr "" -#: views\settingsDialog.py:107 +#: views\settingsDialog.py:102 msgid "プロキシサーバーの情報を手動で設定する(&M)" msgstr "" -#: views\settingsDialog.py:108 +#: views\settingsDialog.py:103 msgid "サーバーURL" msgstr "" -#: views\settingsDialog.py:110 +#: views\settingsDialog.py:105 msgid "ポート番号" msgstr "" -#: views\settingsDialog.py:145 +#: views\settingsDialog.py:140 msgid "IDとPWは両方を入力するか、両方を空欄としてください。" msgstr "" -#: views\settingsDialog.py:149 +#: views\settingsDialog.py:144 msgid "" "ログインした状態で質問をする場合には、IDとパスワードを入力してください。" msgstr "" +#: views\SimpleInputDialog.py:87 views\SimpleInputDialog.py:96 +msgid "入力内容に誤りがあります。" +msgstr "" + +#: views\SimpleInputDialog.py:87 +#, python-format +msgid "行: %d" +msgstr "" + +#: views\SimpleInputDialog.py:92 +msgid "有効な値が入力されていません。" +msgstr "" + #: views\updateDialog.py:23 #, python-format msgid "アップデート - %s" diff --git a/locale/messages.po b/locale/messages.po index f25e2f9..a07ff4c 100644 --- a/locale/messages.po +++ b/locale/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: NPC\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-12-18 14:44+0900\n" +"POT-Creation-Date: 2023-04-29 23:44+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,12 +17,28 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AppBase.py:45 +#: app.py:82 views\main.py:677 +msgid "" +"設定の保存に失敗しました。下記のファイルへのアクセスが可能であることを確認し" +"てください。" +msgstr "" + +#: AppBase.py:48 msgid "" "ログ機能の初期化に失敗しました。下記のファイルへのアクセスが可能であることを" "確認してください。" msgstr "" +#: AppBase.py:57 +msgid "音声エンジンエラー" +msgstr "" + +#: AppBase.py:57 +msgid "" +"音声読み上げ機能の初期化に失敗したため、読み上げ機能を使用できません。出力先" +"の変更をお試しください。" +msgstr "" + #: keymapHandlerBase.py:696 keymapHandlerBase.py:726 #, python-format msgid "%s は存在しないキーです。" @@ -97,8 +113,8 @@ msgstr "" msgid "登録済みユーザリスト(&L)" msgstr "" -#: menuItemsDic.py:24 views\main.py:290 -msgid "Twitterのフォローリストから一括登録" +#: menuItemsDic.py:24 views\main.py:308 +msgid "ユーザの一括追加" msgstr "" #: menuItemsDic.py:25 @@ -179,21 +195,6 @@ msgstr "" msgid "列の並び替え(&R)" msgstr "" -#: twitterService.py:36 -msgid "" -"認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってくださ" -"い。" -msgstr "" - -#: twitterService.py:37 -msgid "認証に失敗しました。もう一度お試しください。" -msgstr "" - -#: twitterService.py:38 -msgid "" -"しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。" -msgstr "" - #: update.py:50 update.py:59 update.py:73 update.py:79 update.py:90 #: update.py:98 update.py:103 update.py:108 update.py:160 #: views\updateDialog.py:39 @@ -274,7 +275,7 @@ msgid "受信しない" msgstr "" #: views\accountSettingsDialog.py:34 views\globalKeyConfig.py:75 -#: views\settingsDialog.py:61 +#: views\settingsDialog.py:57 msgid "設定" msgstr "" @@ -318,19 +319,19 @@ msgstr "" msgid "アーカイブ済みの質問" msgstr "" -#: views\answerDialog.py:87 +#: views\answerDialog.py:90 msgid "回答の入力" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答完了" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答が送信されました。" msgstr "" -#: views\answerDialog.py:96 +#: views\answerDialog.py:99 msgid "" "指定された質問が存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -342,11 +343,11 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 msgid "質問をアーカイブ" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 #, python-format msgid "" "以下の質問をアーカイブしますか?\n" @@ -354,11 +355,11 @@ msgid "" "%s" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 msgid "質問を元に戻す" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 #, python-format msgid "" "以下の質問を元に戻しますか?\n" @@ -408,12 +409,12 @@ msgstr "" #: views\candidateUserListDialog.py:48 views\KeyValueSettingDialogBase.py:84 #: views\KeyValueSettingDialogBase.py:275 views\listConfigurationDialog.py:60 -#: views\searchConditionDialog.py:38 views\settingsDialog.py:115 -#: views\SimpleInputDialog.py:40 views\updateDialog.py:45 +#: views\searchConditionDialog.py:38 views\settingsDialog.py:110 +#: views\SimpleInputDialog.py:56 views\updateDialog.py:45 msgid "キャンセル" msgstr "" -#: views\candidateUserListDialog.py:63 views\main.py:240 +#: views\candidateUserListDialog.py:63 views\main.py:239 #: views\userListDialog.py:79 msgid "ユーザの削除" msgstr "" @@ -464,7 +465,7 @@ msgstr "" msgid "識別子" msgstr "" -#: views\globalKeyConfig.py:31 views\main.py:489 +#: views\globalKeyConfig.py:31 views\main.py:475 msgid "ショートカットキーの設定" msgstr "" @@ -473,7 +474,7 @@ msgstr "" #: views\globalKeyConfig.py:120 views\globalKeyConfig.py:128 #: views\globalKeyConfig.py:138 views\globalKeyConfig.py:143 #: views\keyConfig.py:57 views\KeyValueSettingDialogBase.py:333 -#: views\main.py:667 views\main.py:680 +#: views\main.py:659 views\main.py:672 msgid "なし" msgstr "" @@ -513,7 +514,7 @@ msgstr "" msgid "このショートカットは変更できません。" msgstr "" -#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:477 +#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:463 msgid "設定完了" msgstr "" @@ -558,7 +559,7 @@ msgstr "" #: views\KeyValueSettingDialogBase.py:83 views\KeyValueSettingDialogBase.py:274 #: views\listConfigurationDialog.py:59 views\searchConditionDialog.py:37 -#: views\SimpleInputDialog.py:39 +#: views\SimpleInputDialog.py:55 msgid "OK" msgstr "" @@ -632,43 +633,39 @@ msgstr "" msgid "全ての列を非表示にすることはできません。" msgstr "" -#: views\main.py:181 +#: views\main.py:184 msgid "ファイル(&F)" msgstr "" -#: views\main.py:182 +#: views\main.py:185 msgid "フィルタ(&I)" msgstr "" -#: views\main.py:183 +#: views\main.py:186 msgid "アカウント(&A)" msgstr "" -#: views\main.py:184 +#: views\main.py:187 msgid "オプション(&O)" msgstr "" -#: views\main.py:185 +#: views\main.py:188 msgid "ヘルプ(&H)" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "ユーザの追加" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "peingページURLまたはTwitterユーザ名" msgstr "" -#: views\main.py:211 -msgid "指定されたユーザは既に登録済みです。" -msgstr "" - -#: views\main.py:218 +#: views\main.py:216 msgid "ユーザ追加" msgstr "" -#: views\main.py:218 +#: views\main.py:216 #, python-format msgid "" "以下のユーザを追加しますか?\n" @@ -677,21 +674,17 @@ msgid "" "%(name)s(%(account)s)" msgstr "" -#: views\main.py:222 views\main.py:379 +#: views\main.py:221 views\main.py:365 msgid "登録完了" msgstr "" -#: views\main.py:222 +#: views\main.py:221 msgid "" "ユーザの登録に成功しました。今回登録したユーザの回答を表示するには、ビューを" "再読み込みしてください。" msgstr "" -#: views\main.py:225 -msgid "ユーザの登録に失敗しました。" -msgstr "" - -#: views\main.py:240 views\userListDialog.py:79 +#: views\main.py:239 views\userListDialog.py:79 #, python-format msgid "" "以下のユーザの登録と、過去の回答履歴を削除しますか?\n" @@ -699,78 +692,42 @@ msgid "" "%s" msgstr "" -#: views\main.py:253 +#: views\main.py:252 msgid "" "このユーザは既に退会したか、peingIDを変更しているため開くことができません。" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "出力先ファイルの指定" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "CSVファイル(*.csv) | *.csv; | すべてのファイル(*.*) | *.*" msgstr "" #: views\main.py:290 -msgid "Twitterアカウントの認証のため、ブラウザの操作を待っています。" -msgstr "" - -#: views\main.py:297 -msgid "" -"Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、" -"またはインターネット接続に問題がある可能性があります。" -msgstr "" - -#: views\main.py:303 msgid "対象ユーザの指定" msgstr "" -#: views\main.py:303 +#: views\main.py:291 msgid "" -"フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してく" -"ださい。\n" -"後悔アカウント、認証に用いたアカウント、\n" -"または認証に用いたアカウントがフォローしている非公開アカウントを指定できま" -"す。" +"対象アカウントの@からはじまるアカウント名を、\n" +"改行区切りで入力してください。" msgstr "" -#: views\main.py:314 -msgid "フォローリストを取得しています。" -msgstr "" - -#: views\main.py:318 -msgid "" -"Twitterからフォローリストを取得できませんでした。指定したユーザが存在しない" -"か、フォローしていない非公開アカウントである可能性があります。" -msgstr "" - -#: views\main.py:320 -msgid "" -"Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試し" -"ください。状況が改善しない場合には、開発者までお問い合わせください。" -msgstr "" - -#: views\main.py:325 -msgid "" -"Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないア" -"カウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待っ" -"てから再度お試しください。" -msgstr "" - -#: views\main.py:328 +#: views\main.py:308 msgid "登録済みユーザのリストを取得しています。" msgstr "" -#: views\main.py:340 +#: views\main.py:326 msgid "Peingへの登録状況を調べています。" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "通信エラー" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "" "Peingとの通信でエラーが発生しました。インターネット接続を確認し、しばらくたっ" "てから再度お試しください。状況が改善しない場合は、Twitterでのフォロー数が多す" @@ -780,25 +737,25 @@ msgid "" "あれば一覧が表示されます。" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "処理終了" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "一括登録を試みましたが、登録の候補となるユーザが見つかりませんでした。" msgstr "" -#: views\main.py:374 +#: views\main.py:360 msgid "指定されたユーザを登録しています。" msgstr "" -#: views\main.py:379 +#: views\main.py:365 msgid "" "ユーザの一括登録に成功しました。今回登録したユーザの回答を表示するには、" "ビューを再読み込みしてください。" msgstr "" -#: views\main.py:445 views\main.py:454 views\main.py:463 +#: views\main.py:431 views\main.py:440 views\main.py:449 msgid "" "質問の取得に失敗しました。以下の対処をお試しください。\n" "\n" @@ -807,7 +764,7 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:473 +#: views\main.py:459 msgid "" "ログインまたはアカウント設定の取得に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -819,23 +776,23 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:477 +#: views\main.py:463 msgid "設定しました。" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "準備中" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "回答データを取得しています" msgstr "" -#: views\main.py:568 +#: views\main.py:554 msgid "登録ユーザの更新除外について" msgstr "" -#: views\main.py:568 +#: views\main.py:554 #, python-format msgid "" "登録していた以下のユーザは、アカウント名が変更されたか、削除されました。その" @@ -847,24 +804,24 @@ msgid "" "該当ユーザ:%s" msgstr "" -#: views\main.py:593 +#: views\main.py:582 msgid "質問を投稿" msgstr "" -#: views\main.py:593 +#: views\main.py:582 #, python-format msgid "%sさんへの質問内容" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "投稿完了" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "質問を投稿しました。" msgstr "" -#: views\main.py:620 +#: views\main.py:609 msgid "" "指定されたユーザが存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -875,13 +832,13 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:622 +#: views\main.py:611 msgid "" "Twitterとの通信でエラーが発生しました。指定したユーザ名が間違っているか、イン" "ターネット接続に問題が発生した可能性があります。" msgstr "" -#: views\main.py:624 +#: views\main.py:613 msgid "" "ログインに失敗しました。設定されたアカウント情報に誤りがあります。\n" "\n" @@ -891,13 +848,13 @@ msgid "" "このメッセージと使用したIDの種類を添えて開発者までお問い合わせください。\n" msgstr "" -#: views\main.py:626 +#: views\main.py:615 msgid "" "ログインに失敗しました。ログインに際して権限の認可が要求されています。同じID" "でブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:628 +#: views\main.py:617 msgid "" "ログインに失敗しました。Peingのサーバやお使いのインターネット接続に障害が発生" "している可能性があります。ブラウザから同じIDでログインできるか確認してくださ" @@ -906,7 +863,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:630 +#: views\main.py:619 msgid "" "ログインに失敗しました。Twitterのサーバやお使いのインターネット接続に障害が発" "生している可能性があります。ブラウザから同じIDでログインできるか確認してくだ" @@ -915,7 +872,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:632 +#: views\main.py:621 msgid "" "不明なエラーの為、ログインに失敗しました。サイトの仕様変更や、お使いのイン" "ターネット接続の障害が考えられます。まずは、ブラウザから同じIDでログインでき" @@ -924,26 +881,40 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:634 +#: views\main.py:623 msgid "" "ログインに失敗しました。ログインに際してRECAPTCHA(ロボットでないことの確認)が" "要求されています。同じIDでブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:636 +#: views\main.py:625 +msgid "指定されたユーザは既に登録済みです。" +msgstr "" + +#: views\main.py:627 #, python-format msgid "" "不明なエラー%(code)dが発生しました。大変お手数ですが、本ソフトの実行ファイル" "のあるディレクトリに生成された%(log)sを添付し、作者までご連絡ください。" msgstr "" -#: views\main.py:691 +#: views\main.py:684 msgid "" "この機能を利用するには、ログインが必要です。\n" "[オプション]→[設定]にて、アカウント情報を設定してください。詳細は、readme.txt" "をご確認ください。" msgstr "" +#: views\main.py:700 +#, python-format +msgid "%d個中%d個目を選択中" +msgstr "" + +#: views\main.py:702 +#, python-format +msgid "%d個表示中、選択項目なし" +msgstr "" + #: views\progress.py:35 msgid "中止(&C)" msgstr "" @@ -988,107 +959,120 @@ msgstr "" msgid "詳細を表示(&D)" msgstr "" -#: views\settingsDialog.py:46 +#: views\settingsDialog.py:42 msgid "標準" msgstr "" -#: views\settingsDialog.py:47 +#: views\settingsDialog.py:43 msgid "ダーク" msgstr "" -#: views\settingsDialog.py:50 +#: views\settingsDialog.py:46 msgid "画面幅で折り返し" msgstr "" -#: views\settingsDialog.py:51 +#: views\settingsDialog.py:47 msgid "折り返さない" msgstr "" -#: views\settingsDialog.py:72 +#: views\settingsDialog.py:68 msgid "カテゴリ選択" msgstr "" -#: views\settingsDialog.py:75 +#: views\settingsDialog.py:71 msgid "一般" msgstr "" -#: views\settingsDialog.py:76 +#: views\settingsDialog.py:72 msgid "起動時に最新の情報を取得する" msgstr "" -#: views\settingsDialog.py:78 +#: views\settingsDialog.py:74 msgid "次回起動時にフィルタの状況を維持" msgstr "" -#: views\settingsDialog.py:80 +#: views\settingsDialog.py:76 msgid "次回起動時にカーソルの位置を復元" msgstr "" -#: views\settingsDialog.py:82 +#: views\settingsDialog.py:78 msgid "ログ記録レベル(&L)" msgstr "" -#: views\settingsDialog.py:86 +#: views\settingsDialog.py:82 msgid "ログイン" msgstr "" -#: views\settingsDialog.py:87 -msgid "利用するIDの種類" -msgstr "" - -#: views\settingsDialog.py:90 +#: views\settingsDialog.py:85 msgid "パスワード(&P)" msgstr "" -#: views\settingsDialog.py:92 +#: views\settingsDialog.py:87 msgid "ログインした状態で質問する" msgstr "" -#: views\settingsDialog.py:99 +#: views\settingsDialog.py:91 msgid "表示/言語" msgstr "" -#: views\settingsDialog.py:100 +#: views\settingsDialog.py:92 msgid "言語(&L)" msgstr "" -#: views\settingsDialog.py:101 +#: views\settingsDialog.py:93 msgid "画面表示モード(&D)" msgstr "" -#: views\settingsDialog.py:102 +#: views\settingsDialog.py:94 msgid "テキストの折り返し(&W)" msgstr "" -#: views\settingsDialog.py:105 +#: views\settingsDialog.py:95 +msgid "複数行の質問・回答を入力可能にする" +msgstr "" + +#: views\settingsDialog.py:100 msgid "ネットワーク" msgstr "" -#: views\settingsDialog.py:106 +#: views\settingsDialog.py:101 msgid "起動時に更新を確認(&U)" msgstr "" -#: views\settingsDialog.py:107 +#: views\settingsDialog.py:102 msgid "プロキシサーバーの情報を手動で設定する(&M)" msgstr "" -#: views\settingsDialog.py:108 +#: views\settingsDialog.py:103 msgid "サーバーURL" msgstr "" -#: views\settingsDialog.py:110 +#: views\settingsDialog.py:105 msgid "ポート番号" msgstr "" -#: views\settingsDialog.py:145 +#: views\settingsDialog.py:140 msgid "IDとPWは両方を入力するか、両方を空欄としてください。" msgstr "" -#: views\settingsDialog.py:149 +#: views\settingsDialog.py:144 msgid "" "ログインした状態で質問をする場合には、IDとパスワードを入力してください。" msgstr "" +#: views\SimpleInputDialog.py:87 views\SimpleInputDialog.py:96 +msgid "入力内容に誤りがあります。" +msgstr "" + +#: views\SimpleInputDialog.py:87 +#, python-format +msgid "行: %d" +msgstr "" + +#: views\SimpleInputDialog.py:92 +msgid "有効な値が入力されていません。" +msgstr "" + #: views\updateDialog.py:23 #, python-format msgid "アップデート - %s"