Upgrade to OpenStack Queens

This PS does:
1) Build and run Daisycloud-core in queens env
2) Upgrade image verison to Queens
3) Remove UI out from daisycloud-core

Change-Id: Iecdce8bf73001a7930c2f90cb814e4bfcbaae7c4
Signed-off-by: Zhijiang Hu <hu.zhijiang@zte.com.cn>
This commit is contained in:
Zhijiang Hu 2018-03-30 21:11:22 +08:00
parent 2c63adb20a
commit c490b9ec1b
840 changed files with 6 additions and 312246 deletions

View File

@ -1,484 +0,0 @@
Aaron Rosen <arosen@nicira.com>
Aaron Sahlin <asahlin@us.ibm.com>
Abhijeet Malawade <Abhijeet.Malawade@nttdata.com>
Abishek Subramanian <absubram@cisco.com>
Adam Gandelman <adam.gandelman@canonical.com>
Adrien Cunin <adrien.cunin@osones.com>
Adrien Vergé <adrien.verge@numergy.com>
Akihiro MOTOKI <amotoki@gmail.com>
Akihiro MOTOKI <motoki@da.jp.nec.com>
Akihiro Motoki <motoki@da.jp.nec.com>
Ala Rezmerita <ala.rezmerita@cloudwatt.com>
Alan Fung <wingfung@cisco.com>
Alejandro Emanuel Paredes <alejandro.e.paredes@intel.com>
Alessandro Pilotti <apilotti@cloudbasesolutions.com>
Alessio Ababilov <aababilov@griddynamics.com>
Alex Chan <alexc2@cisco.com>
Alex Gaynor <alex.gaynor@gmail.com>
Alexey Izbyshev <izbyshev@ispras.ru>
Ambroise Christea <ambroise.christea@cloudwatt.com>
Ami Jeain <ajeain@redhat.com>
Ana Krivokapic <akrivoka@redhat.com>
Ana Malagon <atmalagon@gmail.com>
Anastasia Karpinska <akarpinska@griddynamics.com>
Andreas Jaeger <aj@suse.de>
Andres Buraschi <andres.buraschi@intel.com>
Andrew Bramley <andrew@tesora.com>
Andrew Lazarev <alazarev@mirantis.com>
Andrews Medina <andrewsmedina@gmail.com>
Andy Chong <andycjw@gmail.com>
Anita Kuno <akuno@lavabit.com>
Annapoornima Koppad <a.koppad@gmail.com>
Anne Gentle <anne@openstack.org>
Anthony Young <sleepsonthefloor@gmail.com>
Anton V. Yanchenko <simplylizz@gmail.com>
Anya Marshall <anya.elise.marshall@gmail.com>
Artem Osadchiy <aosadchiy@maprtech.com>
Artem Osadchyi <aosadchiy@maprtech.com>
Arvind Somya <asomya@cisco.com>
Ashish Chandra <mail.ashishchandra@gmail.com>
Assaf Muller <amuller@redhat.com>
Attila Fazekas <afazekas@redhat.com>
Avishay Balderman <avishayb@radware.com>
Babitha Donepudi <donepudi.babitha@tcs.com>
Bartosz Fic <bartosz.fic@intel.com>
Behdad Fariba <behdad@yahoo-inc.com>
Bernhard M. Wiedemann <bwiedemann@suse.de>
Bhavanishankar Ravindra <right2bshankar@gmail.com>
Bradley Jones <jones.bradley@me.com>
Brant Knudson <bknudson@us.ibm.com>
Brian DeHamer <brian.dehamer@hp.com>
Brian Fischer <brian.fischer@hp.com>
Brian Tully <brian.tully@hp.com>
Brian Waldon <bcwaldon@gmail.com>
Brianna Poulos <Brianna.Poulos@jhuapl.edu>
Brooklyn Chen <brooklyn.chen@canonical.com>
CHARDON Gerome <gerome.chardon@thalesgroup.com>
Carlo Truijllo <truijllo@crs4.it>
Cedric Brandily <zzelle@gmail.com>
Cedric Soulas <cedric.soulas@cloudwatt.com>
Chad Lung <chad.lung@gmail.com>
Chad Roberts <croberts@redhat.com>
Chaitanya Challa <cvskchaitanya@gmail.com>
Charles V Bock <Charles.V.Bock@intel.com>
ChenZheng <chen.zheng@easystack.cn>
Chris Johnson <wchrisjohnson@gmail.com>
Chris St. Pierre <stpierre@metacloud.com>
Christian Berendt <berendt@b1-systems.de>
Christian Berendt <mail@cberendt.net>
Chuck Short <chuck.short@canonical.com>
Cindy Lu <clu@us.ibm.com>
Claire Delcourt <cldelcou@gmail.com>
Clark Boylan <clark.boylan@gmail.com>
Clayton O'Neill <clayton@oneill.net>
Cody A.W. Somerville <cody.somerville@hp.com>
Cole Robinson <crobinso@redhat.com>
Cristian A Sanchez <cristian.a.sanchez@intel.com>
Cristian Tomoiaga <ctomoiaga@gmail.com>
CristianFiorentino <cristian.fiorentino@intel.com>
Cyril Roelandt <cyril.roelandt@enovance.com>
Dan Reif <openstack@angelfaq.com>
Dan Wendlandt <dan@nicira.com>
Daniel Gauthier <gaud@gaudtechnologies.com>
Daniel Korn <dkorn@redhat.com>
Daniel P. Berrange <berrange@redhat.com>
David Caudill <david@dcaudill.com>
David Lapsley <david.lapsley@metacloud.com>
David Lyle <david.lyle@hp.com>
David Lyle <david.lyle@intel.com>
Davide Guerri <davide.guerri@hp.com>
Dean Troyer <dtroyer@gmail.com>
Denise Hale <denise.hale@hp.com>
Devin Carlen <devin.carlen@gmail.com>
Diana Whitten <hurgleburgler@gmail.com>
Diego Garcia del Rio <diego@nuagenetworks.net>
Dimitri Mazmanov <dimitri.mazmanov@ericsson.com>
Dirk Mueller <dirk@dmllr.de>
Dmitry Tantsur <dtantsur@redhat.com>
Doug Doan <dougdoan@gmail.com>
Doug Fish <drfish@us.ibm.com>
Doug Hellmann <doug.hellmann@dreamhost.com>
Du Yujie <du.yujie.os@99cloud.net>
Duncan McGreggor <duncan@dreamhost.com>
Edgar Magana <emagana@gmail.com>
Ekaterina Chernova <efedorova@mirantis.com>
Ekaterina Fedorova <efedorova@mirantis.com>
EmilienM <emilien.macchi@enovance.com>
Emma Steimann <emmasteimann@gmail.com>
Eoghan Glynn <eglynn@redhat.com>
Eric Peterson <ericpeterson@hp.com>
Erwan Gallen <dev@zinux.com>
Eugene Nikanorov <enikanorov@mirantis.com>
Ewan Mellor <ewan.mellor@citrix.com>
Fabrizio Fresco <fabrizio.fresco@hp.com>
Facundo Farias <facundo.farias@intel.com>
Facundo Maldonado <facundo.n.maldonado@intel.com>
Federico Gimenez Nieto <fgimenez@coit.es>
Felipe Reyes <freyes@suse.com>
Fengqian Gao <fengqian.gao@intel.com>
Flavio Percoco <fpercoco@redhat.com>
Floren Llanos <florenllanos@gmail.com>
Francois Eleouet <f.eleouet@gmail.com>
François Magimel <francois.magimel@objectif-libre.com>
Gabriel Briones <gabriel.briones.sayeg@intel.com>
Gabriel Hurley <gabriel@strikeawe.com>
Gabriel Luong <gabriel.luong@gmail.com>
Gabriel Pettier <gabriel.pettier@cloudwatt.com>
Gabriel Wainer <gabrielcw@gmail.com>
Gary W. Smith <gary.w.smith@hp.com>
Geetika Batra <geetika791@gmail.com>
George Peristerakis <george.peristerakis@enovance.com>
George Peristerakis <gperiste@redhat.com>
Georges Dubus <georges.dubus@numergy.com>
Georgi Demirchev <georgi.demirchev@gmail.com>
Ghe Rivero <ghe@debian.org>
Gloria Gu <gloria.gu@hp.com>
Gordon Chung <chungg@ca.ibm.com>
Greg Althaus <galthaus@austin.rr.com>
Guilherme Lazzari <guilherme.lazzari@hp.com>
Guillermo Cabrera <guillermo.d.cabrera@intel.com>
He Yongli <yongli.he@intel.com>
Heiko Krämer <hkraemer@anynines.com>
Hengqing Hu <hudayou@hotmail.com>
Hidekazu Nakamura <nakamura-h@mxd.nes.nec.co.jp>
Ian Cordasco <ian.cordasco@rackspace.com>
Ihar Hrachyshka <ihrachys@redhat.com>
Ilya Shakhat <ishakhat@mirantis.com>
Imre Farkas <ifarkas@redhat.com>
Ionuț Arțăriși <iartarisi@suse.cz>
Ivan A. Melnikov <melnikov@yahoo-inc.com>
Ivan Chavero <ichavero@redhat.com>
Ivan Kolodyazhny <e0ne@e0ne.info>
J. Daniel Schmidt <jdsn@suse.de>
Jake Dahn <jake@ansolabs.com>
Jake Zukowski <jake@ponyloaf.com>
James E. Blair <jeblair@hp.com>
James E. Blair <jeblair@openstack.org>
James Nzomo <kazikubwa@gmail.com>
James Slagle <james.slagle@gmail.com>
Jamie Lennox <jamielennox@redhat.com>
Jan Provaznik <jprovazn@redhat.com>
Janet Yu <jwy@cs.stanford.edu>
Jason Derrett <jason.derrett@hp.com>
Jason E. Rist <jrist@redhat.com>
Jasper Capel <jasper.capel@spilgames.com>
Jay Pipes <jaypipes@gmail.com>
Jeff Kramer <jeff.kramer@hp.com>
Jeffrey Wilcox <jeffjapan@gmail.com>
Jeremy Moffitt <jeremy.moffitt@hp.com>
Jeremy Stanley <fungi@yuggoth.org>
Jesse Andrews <anotherjesse@gmail.com>
Jesse Pretorius <jesse.pretorius@gmail.com>
JiaHao Li <kaho_lai@hotmail.com>
Jiang Yong <jiangyong.hn@gmail.com>
Jianing YANG <jianingy@unitedstack.com>
Jim Yeh <lemonlatte@gmail.com>
Jingjing Ren <jingjing_ren@symantec.com>
Jiri Tomasek <jtomasek@redhat.com>
Joanna H. Huang <joanna.huitzu.huang@gmail.com>
Joanna Huang <joanna.huitzu.huang@gmail.com>
Joe Gordon <joe.gordon0@gmail.com>
Joe Heck <heckj@mac.com>
Joe Topjian <joe@topjian.net>
John Davidge <jodavidg@cisco.com>
John Postlethwait <john.postlethwait@nebula.com>
Johnu George <johnugeo@cisco.com>
Jordan OMara <jomara@redhat.com>
Joris Roovers <jroovers@cisco.com>
Jose Castro Leon <jose.castro.leon@cern.ch>
Joseph Heck <heckj@mac.com>
Josh Durgin <josh.durgin@inktank.com>
Joshua McKenty <joshua@pistoncloud.com>
Juan Manuel Olle <juan.m.olle@intel.com>
Julie Gravel <julie.gravel@hp.com>
Julie Pichon <jpichon@redhat.com>
Julie Pichon <julie.pichon@gmail.com>
Julien Danjou <julien.danjou@enovance.com>
Julien Danjou <julien@danjou.info>
Justin Pomeroy <jpomero@linux.vnet.ibm.com>
Justin Shepherd <jshepher@rackspace.com>
KC Wang <kc.wang@bigswitch.com>
KC Wang <kuangching.wang@gmail.com>
Kahou Lei <kahou82@gmail.com>
Kamil Rykowski <kamil.rykowski@intel.com>
Kanagaraj Manickam <kanagaraj.manickam@hp.com>
Kanchan Gupta <kanchan.gupta1@tcs.com>
Kannan Manickam <arangamani.kannan@gmail.com>
Ke WU <ke.wu@ibeca.me>
Ke Wu <ke.wu@ibeca.me>
Kelly Domico <kelly.domico@hp.com>
Kelsey Tripp <kelsey.tripp@nebula.com>
Ken Pepple <ken.pepple@gmail.com>
Keshava Bharadwaj <kb.sankethi@gmail.com>
Kev Bittner <kevin.bittner@rackspace.com>
Kevin Benton <blak111@gmail.com>
Kevin Benton <kevin.benton@bigswitch.com>
Kevin Kirkpatrick <kevkirkpatrick@gmail.com>
Kieran Spear <kispear@gmail.com>
Kirill Izotov <enykeev@stackstorm.com>
Kui Shi <skuicloud@gmail.com>
Kun Huang <gareth@unitedstack.com>
Kylin CG <kylin7.sg@gmail.com>
LIU Yulong <liuyulong@letv.com>
LIU-Yulong <dragon889@163.com>
LIU-Yulong <liuyulong@letv.com>
Ladislav Smola <lsmola@redhat.com>
Laura Athanasiou <laura.athanasiou@hp.com>
Laura Frank <laura.frank@hp.com>
Laura Frank <ljfrank@gmail.com>
Leandro I. Costantino <leandro.i.costantino@intel.com>
Lei Zhang <zhang.lei.fly@gmail.com>
Li Ma <skywalker.nick@gmail.com>
Liang Bo <liang.bo.os@99cloud.net>
Lin Hua Cheng <lin-hua.cheng@hp.com>
Liz Blanchard <lblanchard@redhat.com>
Luigi Toscano <ltoscano@redhat.com>
Luis de Bethencourt <luis@debethencourt.com>
Lukas Bezdicka <lbezdick@redhat.com>
Malini Bhandaru <malini.k.bhandaru@intel.com>
Marcin Karkocha <marcin.karkocha@intel.com>
Marcos Fermin Lobo <marcos.fermin.lobo@cern.ch>
Marcos Lobo <marcos.fermin.lobo@cern.ch>
Marcus Furlong <furlongm@gmail.com>
Mark Gius <launchpad@markgius.com>
Mark McClain <mark.mcclain@dreamhost.com>
Mark McLoughlin <markmc@redhat.com>
Martin Hickey <martin.hickey@ie.ibm.com>
Martin Kletzander <mkletzan@redhat.com>
Martin Pavlasek <mpavlase@redhat.com>
Masahito Muroi <muroi.masahito@lab.ntt.co.jp>
Masaki Matsushita <glass.saga@gmail.com>
Masco Kaliyamoorthy <masco.kaliyamoorthy@enovance.com>
Matt Borland <matt.borland@hp.com>
Matt Farina <matt@mattfarina.com>
Matt Fischer <matt@mattfischer.com>
Matt Joyce <matt.joyce@cloudscaling.com>
Matt Wagner <matt.wagner@redhat.com>
Matthew Wood <woodm1979@gmail.com>
Matthias Runge <mrunge@redhat.com>
Maxime Vidori <maxime.vidori@enovance.com>
Michael Still <mikal@stillhq.com>
Michael Szilagyi <mszilagyi@gmail.com>
Michael Yu <michayu@ebaysf.com>
Michal Dulko <michal.dulko@intel.com>
Miguel Grinberg <miguel.grinberg@gmail.com>
Mike Hagedorn <mike.hagedorn@hp.com>
Mike Moore <mike@blowmage.com>
Mike Perez <thingee@gmail.com>
Mike Scherbakov <mihgen@gmail.com>
Mingyan Bao <bao.mingyan@hp.com>
Monty Taylor <mordred@inaugust.com>
Nachi Ueno <nachi@ntti3.com>
Nachi Ueno <nachi@nttmcl.com>
Nathan Beittenmiller <nbeittenmiller@softlayer.com>
Nathan Reller <Nathan.Reller@jhuapl.edu>
Neil Johnston <onewheeldrive.net@gmail.com>
Nicolas Simonds <nic@metacloud.com>
Nikhil Manchanda <SlickNik@gmail.com>
Nikita Konovalov <nkonovalov@mirantis.com>
Noboru Arai <arai@mxa.nes.nec.co.jp>
Noorul Islam K M <noorul@noorul.com>
Om Prakash Pandey <pandeyop@gmail.com>
Omri Gazitt <ogazitt@gmail.com>
Paolo Gatti <paolo.gatti84@gmail.com>
Paul Belanger <paul.belanger@polybeacon.com>
Paul Karikh <pkarikh@mirantis.com>
Paul McMillan <paul.mcmillan@nebula.com>
Pavel Sviderski <pavel@psviderski.name>
Pawel Palucki <pawel.palucki@intel.com>
Pawel Skowron <pawel.skowron@intel.com>
Pedro Kostelec <pedro.kostelec@xlab.si>
Peng Wu <alexepico@gmail.com>
Peter Belanyi <pbelanyi@redhat.com>
Prasoon Telang <prasoontelang@gmail.com>
Pádraig Brady <pbrady@redhat.com>
Qijing Li <qijing.lee@gmail.com>
Rabi Mishra <ramishra@redhat.com>
Radomir Dopieralski <openstack@sheep.art.pl>
Rafi Khardalian <rafi@metacloud.com>
Randy Bertram <rbertram@us.ibm.com>
Ravi Repaka <rrepaka@yahoo-inc.com>
Ray Chen <oldsharp@163.com>
Rich Bowen <rbowen@rcbowen.com>
Rich Hagarty <richard.hagarty@hp.com>
Richard Jones <r1chardj0n3s@gmail.com>
Rishabh Jain <rishabja@cisco.com>
Rob <robert.cresswell@outlook.com>
Rob Cresswell <rcresswe@cisco.com>
Rob Cresswell <robert.cresswell@outlook.com>
Rob Raymond <rob.raymond@hp.com>
Robert C. Barth <rcbarth@norimek.com>
Robert Mizielski <robert.mizielski@cloudwatt.com>
Robert Myers <robert.myers@rackspace.com>
Rodrigo Duarte Sousa <rodrigods@lsd.ufcg.edu.br>
Romain Hardouin <romain_hardouin@yahoo.fr>
Roman Podolyaka <rpodolyaka@mirantis.com>
Roman Rader <roman.rader@gmail.com>
Rosario Di Somma <rosario.disomma@dreamhost.com>
Russell Bryant <rbryant@redhat.com>
Russell Sim <russell.sim@gmail.com>
Ryan Hsu <rhsu@vmware.com>
Ryan Petrello <lists@ryanpetrello.com>
Ryan Petrello <ryan.petrello@dreamhost.com>
Sahid Orentino Ferdjaoui <sahid.ferdjaoui@cloudwatt.com>
Salvo Rapisarda <sdrapisarda@gmail.com>
Sam Betts <sam@code-smash.net>
Sam Morrison <sorrison@gmail.com>
Sam Stoelinga <sammiestoel@gmail.com>
Santiago Baldassin <santiago.b.baldassin@intel.com>
Saro Chandra Bhooshan <bhooshan@hp.com>
Sascha Peilicke <saschpe@gmx.de>
Sascha Peilicke <saschpe@mailbox.org>
Sascha Peilicke <saschpe@suse.de>
Sascha Peilicke <speilicke@suse.com>
Sayali Lunkad <sayali.92720@gmail.com>
Sean Dague <sdague@linux.vnet.ibm.com>
Sean Dague <sean@dague.net>
Sergey Lukjanov <slukjanov@mirantis.com>
Sergey Reshetnyak <sreshetniak@mirantis.com>
Sergio Cazzolato <sergio.j.cazzolato@intel.com>
Shamail Tahir <itzshamail@gmail.com>
Shane Wang <shane.wang@intel.com>
Shaoquan Chen <sean.chen2@hp.com>
Shuichiro MAKIGAKI <shuichiro.makigaki@gmail.com>
Simon Chung <slchung@yahoo-inc.com>
Solly Ross <sross@redhat.com>
Stephane Angot <sa@hydre.org>
Stephen Gordon <sgordon@redhat.com>
Steve Baker <sbaker@redhat.com>
Steve Leon <steve.leon@hp.com>
SudheerKall <sudheer.kalla@tcs.com>
Sushil Kumar <sushil.kumar2@globallogic.com>
Swaminathan Vasudevan <swaminathan.vasudevan@hp.com>
Szymon Wroblewski <szymon.wroblewski@intel.com>
Tapan Sharma <tapan.sharma@hp.com>
Tatiana Mazur <tmazur@mirantis.com>
Tatiana Ovchinnikova <t.v.ovtchinnikova@gmail.com>
Thai Tran <tqtran@us.ibm.com>
Thiago Paiva <thiagop@lsd.ufcg.edu.br>
Thiago Paiva Brito <thiagop@lsd.ufcg.edu.br>
Thierry Carrez <thierry@openstack.org>
Thomas Goirand <thomas@goirand.fr>
Thomas Stenberg <thomas.stenberg@tieto.com>
Tianpeng Wang <timon86.wang@gmail.com>
Tihomir Trifonov <t.trifonov@gmail.com>
Tim Schnell <tim.schnell@rackspace.com>
Timur Sufiev <tsufiev@mirantis.com>
Todd Willey <todd@ansolabs.com>
Tom Fifield <fifieldt@unimelb.edu.au>
Tom Fifield <tom@openstack.org>
Tomas Novacik <tnovacik@redhat.com>
Tomas Sedovic <tomas@sedovic.cz>
Tomasz 'Zen' Napierala <tomasz@napierala.org>
Tomáš Nováčik <tnovacik@gmail.com>
Toshi Hayashi <hayashi@ntti3.com>
Toshiyuki Hayashi <hayashi@nttmcl.com>
Travis Tripp <travis.tripp@hp.com>
Tres Henry <tres@treshenry.net>
Trung Trinh <trung.t.trinh@dektech.com.au>
Tyr Johanson <tyr@hp.com>
Tzu-Mainn Chen <tzumainn@redhat.com>
Vahid Hashemian <vahidhashemian@us.ibm.com>
Valerii Zhelezniakov <vzhelezniakov@mirantis.com>
Veronica Musso <veronica.a.musso@intel.com>
Vic Howard <victor.r.howard@gmail.com>
Victor Morales <victor.morales@intel.com>
Victoria Martinez de la Cruz <vickymsee@gmail.com>
Victoria Martínez de la Cruz <vickymsee@gmail.com>
Vincent Untz <vuntz@suse.com>
Vishvananda Ishaya <vishvananda@gmail.com>
Vishwanath Jayaraman <vishwanathj@hotmail.com>
Visnusaran Murugan <visnusaran.murugan@hp.com>
Vlad Okhrimenko <vokhrimenko@mirantis.com>
Wlodzimierz Borkowski <wlodek.borkowski@gmail.com>
Wu Wenxiang <wu.wenxiang@99cloud.net>
Xiao Hanyu <xiaohanyu1988@gmail.com>
XinXiaohui <xiaohui.xin@intel.com>
Yangyang Zheng <sunnyzh@cienet.com.cn>
Yanping Xie <irsxyp@gmail.com>
Yash Bathia <ybathia@yahoo-inc.com>
Yidan Zhang <zvivian88@gmail.com>
Yuanhui Liu <liuyu@us.ibm.com>
Yuliya Portnova <yportnov@yahoo-inc.com>
Yuriy Taraday <yorik.sar@gmail.com>
Yves-Gwenael Bourhis <yves-gwenael.bourhis@cloudwatt.com>
ZHU ZHU <zhuzhubj@cn.ibm.com>
Zhang Chun <zhang.chun.os@99cloud.net>
Zhang Hua <joshua.zhang@canonical.com>
Zhang John <zhang.john.vmthunder@gmail.com>
Zhenguo Niu <niuzhenguo@huawei.com>
Zhenguo Niu <zhenguo@unitedstack.com>
ZhiQiang Fan <aji.zqfan@gmail.com>
Zhigang Wang <w1z2g3@gmail.com>
Zhongyue Luo <zhongyue.nah@intel.com>
Ziad Sawalha <github@highbridgellc.com>
aababilov <aababilov@griddynamics.com>
absubram <absubram@absubram-VirtualBox.(none)>
amcrn <amcreynolds@ebaysf.com>
amitpp <amitpp23@gmail.com>
ankitagrawal <ankit11.agrawal@nttdata.com>
armando-migliaccio <amigliaccio@nicira.com>
avpra <pradeep.av@hp.com>
chenhaiq <chenhaiq@cn.ibm.com>
daisy-ycguo <guoyingc@cn.ibm.com>
daniel-a-nguyen <dan.nguyens.mail@gmail.com>
dkorn <dkorn@redhat.com>
dominik dobruchowski <dominik.dobruchowski@intel.com>
eric <ejpetey@gmail.com>
eric <eric.peterson1@twcable.com>
ericpeterson-l <ericpeterson@hp.com>
facundo Farias <facundo.farias@intel.com>
heather <heather@spine.(none)>
hyphon-zh <ghj114@gmail.com>
imran <hayderimran7@gmail.com>
imran <imran@cloudscaling.com>
jackychen <chen.zheng@easystack.cn>
jakedahn <jake@ansolabs.com>
jakedahn <jake@markupisart.com>
jaypipes <jaypipes@gmail.com>
jeffjapan <jeffjapan@gmail.com>
jing.liuqing <jing.liuqing@99cloud.net>
jmatayoshi <jun11matayoshi@gmail.com>
johndavidge <jodavidg@cisco.com>
keshy <keshi8086@gmail.com>
kstev <kevin@kstev.com>
lawrancejing <lawrancejing@gamil.com>
lawrancejing <lawrancejing@gmail.com>
lin-hua-cheng <lin-hua.cheng@hp.com>
lin-hua-cheng <os.lcheng@gmail.com>
liuqing <jing.liuqing@99cloud.net>
liyingjun <liyingjun1988@gmail.com>
liyingjun <yingjun.li@kylin-cloud.com>
lrqrun <lrqrun@gmail.com>
mariamj@us.ibm.com <mariamj@us.ibm.com>
marianitadn <maria.nita.dn@gmail.com>
masco <Masco.kaliyamoorthy@enovance.com>
mavinagi <amogh-r.mavinagidad@hp.com>
meena <meena.pitchiah@hp.com>
nanhai liao <nanhai.liao@kylin-cloud.com>
nikunj2512 <nikunj.aggarwal@hp.com>
nyechiel <nyechiel@redhat.com>
qiaojian <qiaojian@awcloud.com>
ravikumar-venkatesan <ravikumar.venkatesan@hp.com>
root <lawrancejing@gmail.com>
sagardmni <sagardmni@gmail.com>
sayalilunkad <sayali.92720@gmail.com>
simon <simon@unitedstack.com>
sleepsonthefloor <sleepsonthefloor@gmail.com>
swati <swati.shukla1@tcs.com>
tanlin <lin.tan@intel.com>
termie <github@anarkystic.com>
tianliang <tianliang@awcloud.com>
tintmy <tangmeiyan77@gmail.com>
tinytmy <tangmeiyan77@gmail.com>
utsav dusad <utsavdusad@gmail.com>
veena <mveenasl@gmail.com>
whg <whg@hp.com>
woodm1979 <matt.wood@hp.com>
yamini sardana <yamini.sardana@tcs.com>
yuanke wei <weiyuanke123@gmail.com>
zhang-hare <zhuadl@cn.ibm.com>
zhang-jinnan <ben.os@99cloud.net>
zhu.rong <zhu.rong@99cloud.net>
Łukasz Jernaś <deejay1@srem.org>
Łukasz Jernaś <lukasz.jernas@allegro.pl>

View File

@ -1,18 +0,0 @@
If you would like to contribute to the development of OpenStack,
you must follow the steps documented at:
http://docs.openstack.org/developer/horizon/contributing.html
or http://docs.openstack.org/infra/manual/developers.html#development-workflow
Once those steps have been completed, changes to OpenStack
should be submitted for review via the Gerrit tool, following
the workflow documented at:
http://docs.openstack.org/infra/manual/developers.html#development-workflow
Pull requests submitted through GitHub will be ignored.
Bugs should be filed on Launchpad, not GitHub:
https://bugs.launchpad.net/horizon

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
Horizon Style Commandments
==========================
- Step 1: Read the OpenStack Style Commandments
http://docs.openstack.org/developer/hacking/
- Step 2: Read [hacking] section in tox.ini to find the list of names which
can be imported directly without triggering the "H302: import only modules"
flake8 warning
- Step 3: Read on
Horizon Specific Commandments
-----------------------------
- Read the Horizon contributing documentation at http://docs.openstack.org/developer/horizon/contributing.html

View File

@ -1,176 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

View File

@ -1,19 +0,0 @@
recursive-include doc *.py *.rst *.css *.js *.html *.conf *.jpg *.gif *.png *.css_t
recursive-include horizon *.html *.css *.js *.csv *.template *.tmpl *.mo *.po
recursive-include openstack_dashboard *.html *.js *.less *.mo *.po *.example *.eot *.svg *.ttf *.woff *.png *.ico *.wsgi *.gif *.csv *.template
recursive-include tools *.py *.sh
include AUTHORS
include ChangeLog
include LICENSE
include Makefile
include manage.py
include README.rst
include run_tests.sh
include tox.ini
include doc/Makefile
include doc/source/_templates/.placeholder
include requirements.txt
include test-requirements.txt
exclude openstack_dashboard/local/local_settings.py

View File

@ -1,24 +0,0 @@
PYTHON=`which python`
DESTDIR=/
PROJECT=horizon
all:
@echo "make test - Run tests"
@echo "make source - Create source package"
@echo "make install - Install on local system"
@echo "make buildrpm - Generate a rpm package"
@echo "make clean - Get rid of scratch and byte files"
source:
$(PYTHON) setup.py sdist $(COMPILE)
install:
$(PYTHON) setup.py install --root $(DESTDIR) $(COMPILE)
buildrpm:
$(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall
clean:
$(PYTHON) setup.py clean
rm -rf build/ MANIFEST
find . -name '*.pyc' -delete

View File

@ -1,51 +0,0 @@
=============================
Horizon (OpenStack Dashboard)
=============================
Horizon is a Django-based project aimed at providing a complete OpenStack
Dashboard along with an extensible framework for building new dashboards
from reusable components. The ``openstack_dashboard`` module is a reference
implementation of a Django site that uses the ``horizon`` app to provide
web-based interactions with the various OpenStack projects.
* Release management: https://launchpad.net/horizon
* Blueprints and feature specifications: https://blueprints.launchpad.net/horizon
* Issue tracking: https://bugs.launchpad.net/horizon
Using Horizon
=============
See ``doc/source/topics/install.rst`` about how to install Horizon
in your OpenStack setup. It describes the example steps and
has pointers for more detailed settings and configurations.
It is also available at http://docs.openstack.org/developer/horizon/topics/install.html.
Getting Started for Developers
==============================
``doc/source/quickstart.rst`` or
http://docs.openstack.org/developer/horizon/quickstart.html
describes how to setup Horizon development environment and start development.
Building Contributor Documentation
==================================
This documentation is written by contributors, for contributors.
The source is maintained in the ``doc/source`` directory using
`reStructuredText`_ and built by `Sphinx`_
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
.. _Sphinx: http://sphinx-doc.org/
* Building Automatically::
$ ./run_tests.sh --docs
* Building Manually::
$ tools/with_venv.sh sphinx-build doc/source doc/build/html
Results are in the ``doc/build/html`` directory

View File

@ -1,66 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
""" The Horizon interface.
Contains the core Horizon classes--:class:`~horizon.Dashboard` and
:class:`horizon.Panel`--the dynamic URLconf for Horizon, and common interface
methods like :func:`~horizon.register` and :func:`~horizon.unregister`.
"""
# Because this module is compiled by setup.py before Django may be installed
# in the environment we try importing Django and issue a warning but move on
# should that fail.
Horizon = None
try:
from horizon.base import Dashboard # noqa
from horizon.base import Horizon # noqa
from horizon.base import Panel # noqa
from horizon.base import PanelGroup # noqa
except ImportError:
import warnings
def simple_warn(message, category, filename, lineno, file=None, line=None):
return '%s: %s' % (category.__name__, message)
msg = ("Could not import Horizon dependencies. "
"This is normal during installation.\n")
warnings.formatwarning = simple_warn
warnings.warn(msg, Warning)
if Horizon:
register = Horizon.register
unregister = Horizon.unregister
get_absolute_url = Horizon.get_absolute_url
get_user_home = Horizon.get_user_home
get_dashboard = Horizon.get_dashboard
get_default_dashboard = Horizon.get_default_dashboard
get_dashboards = Horizon.get_dashboards
urls = Horizon._lazy_urls
# silence flake8 about unused imports here:
__all__ = [
"Dashboard",
"Horizon",
"Panel",
"PanelGroup",
"register",
"unregister",
"get_absolute_url",
"get_user_home",
"get_dashboard",
"get_default_dashboard",
"get_dashboards",
"urls",
]

View File

@ -1,982 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Contains the core classes and functionality that makes Horizon what it is.
This module is considered internal, and should not be relied on directly.
Public APIs are made available through the :mod:`horizon` module and
the classes contained therein.
"""
import collections
import copy
import inspect
import logging
import os
from django.conf import settings
from django.conf.urls import include
from django.conf.urls import patterns
from django.conf.urls import url
from django.core.exceptions import ImproperlyConfigured # noqa
from django.core.urlresolvers import reverse
from django.utils.datastructures import SortedDict
from django.utils.functional import SimpleLazyObject # noqa
from django.utils.importlib import import_module # noqa
from django.utils.module_loading import module_has_submodule # noqa
from django.utils.translation import ugettext_lazy as _
from horizon import conf
from horizon.decorators import _current_component # noqa
from horizon.decorators import require_auth # noqa
from horizon.decorators import require_perms # noqa
from horizon import loaders
LOG = logging.getLogger(__name__)
def _decorate_urlconf(urlpatterns, decorator, *args, **kwargs):
for pattern in urlpatterns:
if getattr(pattern, 'callback', None):
pattern._callback = decorator(pattern.callback, *args, **kwargs)
if getattr(pattern, 'url_patterns', []):
_decorate_urlconf(pattern.url_patterns, decorator, *args, **kwargs)
def access_cached(func):
def inner(self, context):
session = context['request'].session
try:
if session['allowed']['valid_for'] != session.get('token'):
raise KeyError()
except KeyError:
session['allowed'] = {"valid_for": session.get('token')}
key = "%s.%s" % (self.__class__.__module__, self.__class__.__name__)
if key not in session['allowed']:
session['allowed'][key] = func(self, context)
session.modified = True
return session['allowed'][key]
return inner
class NotRegistered(Exception):
pass
class HorizonComponent(object):
policy_rules = None
def __init__(self):
super(HorizonComponent, self).__init__()
if not self.slug:
raise ImproperlyConfigured('Every %s must have a slug.'
% self.__class__)
def __unicode__(self):
name = getattr(self, 'name', u"Unnamed %s" % self.__class__.__name__)
return unicode(name)
def _get_default_urlpatterns(self):
package_string = '.'.join(self.__module__.split('.')[:-1])
if getattr(self, 'urls', None):
try:
mod = import_module('.%s' % self.urls, package_string)
except ImportError:
mod = import_module(self.urls)
urlpatterns = mod.urlpatterns
else:
# Try importing a urls.py from the dashboard package
if module_has_submodule(import_module(package_string), 'urls'):
urls_mod = import_module('.urls', package_string)
urlpatterns = urls_mod.urlpatterns
else:
urlpatterns = patterns('')
return urlpatterns
@access_cached
def can_access(self, context):
"""Return whether the user has role based access to this component.
This method is not intended to be overridden.
The result of the method is stored in per-session cache.
"""
return self.allowed(context)
def allowed(self, context):
"""Checks if the user is allowed to access this component.
This method should be overridden to return the result of
any policy checks required for the user to access this component
when more complex checks are required.
"""
return self._can_access(context['request'])
def _can_access(self, request):
policy_check = getattr(settings, "POLICY_CHECK_FUNCTION", None)
# this check is an OR check rather than an AND check that is the
# default in the policy engine, so calling each rule individually
if policy_check and self.policy_rules:
for rule in self.policy_rules:
if policy_check((rule,), request):
return True
return False
# default to allowed
return True
class Registry(object):
def __init__(self):
self._registry = {}
if not getattr(self, '_registerable_class', None):
raise ImproperlyConfigured('Subclasses of Registry must set a '
'"_registerable_class" property.')
def _register(self, cls):
"""Registers the given class.
If the specified class is already registered then it is ignored.
"""
if not inspect.isclass(cls):
raise ValueError('Only classes may be registered.')
elif not issubclass(cls, self._registerable_class):
raise ValueError('Only %s classes or subclasses may be registered.'
% self._registerable_class.__name__)
if cls not in self._registry:
cls._registered_with = self
self._registry[cls] = cls()
return self._registry[cls]
def _unregister(self, cls):
"""Unregisters the given class.
If the specified class isn't registered, ``NotRegistered`` will
be raised.
"""
if not issubclass(cls, self._registerable_class):
raise ValueError('Only %s classes or subclasses may be '
'unregistered.' % self._registerable_class)
if cls not in self._registry.keys():
raise NotRegistered('%s is not registered' % cls)
del self._registry[cls]
return True
def _registered(self, cls):
if inspect.isclass(cls) and issubclass(cls, self._registerable_class):
found = self._registry.get(cls, None)
if found:
return found
else:
# Allow for fetching by slugs as well.
for registered in self._registry.values():
if registered.slug == cls:
return registered
class_name = self._registerable_class.__name__
if hasattr(self, "_registered_with"):
parent = self._registered_with._registerable_class.__name__
raise NotRegistered('%(type)s with slug "%(slug)s" is not '
'registered with %(parent)s "%(name)s".'
% {"type": class_name,
"slug": cls,
"parent": parent,
"name": self.slug})
else:
slug = getattr(cls, "slug", cls)
raise NotRegistered('%(type)s with slug "%(slug)s" is not '
'registered.' % {"type": class_name,
"slug": slug})
class Panel(HorizonComponent):
"""A base class for defining Horizon dashboard panels.
All Horizon dashboard panels should extend from this class. It provides
the appropriate hooks for automatically constructing URLconfs, and
providing permission-based access control.
.. attribute:: name
The name of the panel. This will be displayed in the
auto-generated navigation and various other places.
Default: ``''``.
.. attribute:: slug
A unique "short name" for the panel. The slug is used as
a component of the URL path for the panel. Default: ``''``.
.. attribute:: permissions
A list of permission names, all of which a user must possess in order
to access any view associated with this panel. This attribute
is combined cumulatively with any permissions required on the
``Dashboard`` class with which it is registered.
.. attribute:: urls
Path to a URLconf of views for this panel using dotted Python
notation. If no value is specified, a file called ``urls.py``
living in the same package as the ``panel.py`` file is used.
Default: ``None``.
.. attribute:: nav
.. method:: nav(context)
The ``nav`` attribute can be either boolean value or a callable
which accepts a ``RequestContext`` object as a single argument
to control whether or not this panel should appear in
automatically-generated navigation. Default: ``True``.
.. attribute:: index_url_name
The ``name`` argument for the URL pattern which corresponds to
the index view for this ``Panel``. This is the view that
:meth:`.Panel.get_absolute_url` will attempt to reverse.
"""
name = ''
slug = ''
urls = None
nav = True
index_url_name = "index"
def __repr__(self):
return "<Panel: %s>" % self.slug
def get_absolute_url(self):
"""Returns the default URL for this panel.
The default URL is defined as the URL pattern with ``name="index"`` in
the URLconf for this panel.
"""
try:
return reverse('horizon:%s:%s:%s' % (self._registered_with.slug,
self.slug,
self.index_url_name))
except Exception as exc:
# Logging here since this will often be called in a template
# where the exception would be hidden.
LOG.info("Error reversing absolute URL for %s: %s" % (self, exc))
raise
@property
def _decorated_urls(self):
urlpatterns = self._get_default_urlpatterns()
# Apply access controls to all views in the patterns
permissions = getattr(self, 'permissions', [])
_decorate_urlconf(urlpatterns, require_perms, permissions)
_decorate_urlconf(urlpatterns, _current_component, panel=self)
# Return the three arguments to django.conf.urls.include
return urlpatterns, self.slug, self.slug
class PanelGroup(object):
"""A container for a set of :class:`~horizon.Panel` classes.
When iterated, it will yield each of the ``Panel`` instances it
contains.
.. attribute:: slug
A unique string to identify this panel group. Required.
.. attribute:: name
A user-friendly name which will be used as the group heading in
places such as the navigation. Default: ``None``.
.. attribute:: panels
A list of panel module names which should be contained within this
grouping.
"""
def __init__(self, dashboard, slug=None, name=None, panels=None):
self.dashboard = dashboard
self.slug = slug or getattr(self, "slug", "default")
self.name = name or getattr(self, "name", None)
# Our panels must be mutable so it can be extended by others.
self.panels = list(panels or getattr(self, "panels", []))
def __repr__(self):
return "<%s: %s>" % (self.__class__.__name__, self.slug)
def __unicode__(self):
return self.name
def __iter__(self):
panel_instances = []
for name in self.panels:
try:
panel_instances.append(self.dashboard.get_panel(name))
except NotRegistered as e:
LOG.debug(e)
return iter(panel_instances)
class Dashboard(Registry, HorizonComponent):
"""A base class for defining Horizon dashboards.
All Horizon dashboards should extend from this base class. It provides the
appropriate hooks for automatic discovery of :class:`~horizon.Panel`
modules, automatically constructing URLconfs, and providing
permission-based access control.
.. attribute:: name
The name of the dashboard. This will be displayed in the
auto-generated navigation and various other places.
Default: ``''``.
.. attribute:: slug
A unique "short name" for the dashboard. The slug is used as
a component of the URL path for the dashboard. Default: ``''``.
.. attribute:: panels
The ``panels`` attribute can be either a flat list containing the name
of each panel **module** which should be loaded as part of this
dashboard, or a list of :class:`~horizon.PanelGroup` classes which
define groups of panels as in the following example::
class SystemPanels(horizon.PanelGroup):
slug = "syspanel"
name = _("System")
panels = ('overview', 'instances', ...)
class Syspanel(horizon.Dashboard):
panels = (SystemPanels,)
Automatically generated navigation will use the order of the
modules in this attribute.
Default: ``[]``.
.. warning::
The values for this attribute should not correspond to the
:attr:`~.Panel.name` attributes of the ``Panel`` classes.
They should be the names of the Python modules in which the
``panel.py`` files live. This is used for the automatic
loading and registration of ``Panel`` classes much like
Django's ``ModelAdmin`` machinery.
Panel modules must be listed in ``panels`` in order to be
discovered by the automatic registration mechanism.
.. attribute:: default_panel
The name of the panel which should be treated as the default
panel for the dashboard, i.e. when you visit the root URL
for this dashboard, that's the panel that is displayed.
Default: ``None``.
.. attribute:: permissions
A list of permission names, all of which a user must possess in order
to access any panel registered with this dashboard. This attribute
is combined cumulatively with any permissions required on individual
:class:`~horizon.Panel` classes.
.. attribute:: urls
Optional path to a URLconf of additional views for this dashboard
which are not connected to specific panels. Default: ``None``.
.. attribute:: nav
.. method:: nav(context)
The ``nav`` attribute can be either boolean value or a callable
which accepts a ``RequestContext`` object as a single argument
to control whether or not this dashboard should appear in
automatically-generated navigation. Default: ``True``.
.. attribute:: public
Boolean value to determine whether this dashboard can be viewed
without being logged in. Defaults to ``False``.
"""
_registerable_class = Panel
name = ''
slug = ''
urls = None
panels = []
default_panel = None
nav = True
public = False
def __repr__(self):
return "<Dashboard: %s>" % self.slug
def __init__(self, *args, **kwargs):
super(Dashboard, self).__init__(*args, **kwargs)
self._panel_groups = None
def get_panel(self, panel):
"""Returns the specified :class:`~horizon.Panel` instance registered
with this dashboard.
"""
return self._registered(panel)
def get_panels(self):
"""Returns the :class:`~horizon.Panel` instances registered with this
dashboard in order, without any panel groupings.
"""
all_panels = []
panel_groups = self.get_panel_groups()
for panel_group in panel_groups.values():
all_panels.extend(panel_group)
return all_panels
def get_panel_group(self, slug):
"""Returns the specified :class:~horizon.PanelGroup
or None if not registered
"""
return self._panel_groups.get(slug)
def get_panel_groups(self):
registered = copy.copy(self._registry)
panel_groups = []
# Gather our known panels
if self._panel_groups is not None:
for panel_group in self._panel_groups.values():
for panel in panel_group:
registered.pop(panel.__class__)
panel_groups.append((panel_group.slug, panel_group))
# Deal with leftovers (such as add-on registrations)
if len(registered):
slugs = [panel.slug for panel in registered.values()]
new_group = PanelGroup(self,
slug="other",
name=_("Other"),
panels=slugs)
panel_groups.append((new_group.slug, new_group))
return SortedDict(panel_groups)
def get_absolute_url(self):
"""Returns the default URL for this dashboard.
The default URL is defined as the URL pattern with ``name="index"``
in the URLconf for the :class:`~horizon.Panel` specified by
:attr:`~horizon.Dashboard.default_panel`.
"""
try:
return self._registered(self.default_panel).get_absolute_url()
except Exception:
# Logging here since this will often be called in a template
# where the exception would be hidden.
LOG.exception("Error reversing absolute URL for %s." % self)
raise
@property
def _decorated_urls(self):
urlpatterns = self._get_default_urlpatterns()
default_panel = None
# Add in each panel's views except for the default view.
for panel in self._registry.values():
if panel.slug == self.default_panel:
default_panel = panel
continue
url_slug = panel.slug.replace('.', '/')
urlpatterns += patterns('',
url(r'^%s/' % url_slug,
include(panel._decorated_urls)))
# Now the default view, which should come last
if not default_panel:
raise NotRegistered('The default panel "%s" is not registered.'
% self.default_panel)
urlpatterns += patterns('',
url(r'',
include(default_panel._decorated_urls)))
# Require login if not public.
if not self.public:
_decorate_urlconf(urlpatterns, require_auth)
# Apply access controls to all views in the patterns
permissions = getattr(self, 'permissions', [])
_decorate_urlconf(urlpatterns, require_perms, permissions)
_decorate_urlconf(urlpatterns, _current_component, dashboard=self)
# Return the three arguments to django.conf.urls.include
return urlpatterns, self.slug, self.slug
def _autodiscover(self):
"""Discovers panels to register from the current dashboard module."""
if getattr(self, "_autodiscover_complete", False):
return
panels_to_discover = []
panel_groups = []
# If we have a flat iterable of panel names, wrap it again so
# we have a consistent structure for the next step.
if all([isinstance(i, basestring) for i in self.panels]):
self.panels = [self.panels]
# Now iterate our panel sets.
for panel_set in self.panels:
# Instantiate PanelGroup classes.
if not isinstance(panel_set, collections.Iterable) and \
issubclass(panel_set, PanelGroup):
panel_group = panel_set(self)
# Check for nested tuples, and convert them to PanelGroups
elif not isinstance(panel_set, PanelGroup):
panel_group = PanelGroup(self, panels=panel_set)
# Put our results into their appropriate places
panels_to_discover.extend(panel_group.panels)
panel_groups.append((panel_group.slug, panel_group))
self._panel_groups = SortedDict(panel_groups)
# Do the actual discovery
package = '.'.join(self.__module__.split('.')[:-1])
mod = import_module(package)
for panel in panels_to_discover:
try:
before_import_registry = copy.copy(self._registry)
import_module('.%s.panel' % panel, package)
except Exception:
self._registry = before_import_registry
if module_has_submodule(mod, panel):
raise
self._autodiscover_complete = True
@classmethod
def register(cls, panel):
"""Registers a :class:`~horizon.Panel` with this dashboard."""
panel_class = Horizon.register_panel(cls, panel)
# Support template loading from panel template directories.
panel_mod = import_module(panel.__module__)
panel_dir = os.path.dirname(panel_mod.__file__)
template_dir = os.path.join(panel_dir, "templates")
if os.path.exists(template_dir):
key = os.path.join(cls.slug, panel.slug)
loaders.panel_template_dirs[key] = template_dir
return panel_class
@classmethod
def unregister(cls, panel):
"""Unregisters a :class:`~horizon.Panel` from this dashboard."""
success = Horizon.unregister_panel(cls, panel)
if success:
# Remove the panel's template directory.
key = os.path.join(cls.slug, panel.slug)
if key in loaders.panel_template_dirs:
del loaders.panel_template_dirs[key]
return success
def allowed(self, context):
"""Checks for role based access for this dashboard.
Checks for access to any panels in the dashboard and of the the
dashboard itself.
This method should be overridden to return the result of
any policy checks required for the user to access this dashboard
when more complex checks are required.
"""
# if the dashboard has policy rules, honor those above individual
# panels
if not self._can_access(context['request']):
return False
# check if access is allowed to a single panel,
# the default for each panel is True
for panel in self.get_panels():
if panel.can_access(context):
return True
return False
class Workflow(object):
pass
try:
from django.utils.functional import empty # noqa
except ImportError:
# Django 1.3 fallback
empty = None
class LazyURLPattern(SimpleLazyObject):
def __iter__(self):
if self._wrapped is empty:
self._setup()
return iter(self._wrapped)
def __reversed__(self):
if self._wrapped is empty:
self._setup()
return reversed(self._wrapped)
def __len__(self):
if self._wrapped is empty:
self._setup()
return len(self._wrapped)
def __getitem__(self, idx):
if self._wrapped is empty:
self._setup()
return self._wrapped[idx]
class Site(Registry, HorizonComponent):
"""The overarching class which encompasses all dashboards and panels."""
# Required for registry
_registerable_class = Dashboard
name = "Horizon"
namespace = 'horizon'
slug = 'horizon'
urls = 'horizon.site_urls'
def __repr__(self):
return u"<Site: %s>" % self.slug
@property
def _conf(self):
return conf.HORIZON_CONFIG
@property
def dashboards(self):
return self._conf['dashboards']
@property
def default_dashboard(self):
return self._conf['default_dashboard']
def register(self, dashboard):
"""Registers a :class:`~horizon.Dashboard` with Horizon."""
return self._register(dashboard)
def unregister(self, dashboard):
"""Unregisters a :class:`~horizon.Dashboard` from Horizon."""
return self._unregister(dashboard)
def registered(self, dashboard):
return self._registered(dashboard)
def register_panel(self, dashboard, panel):
dash_instance = self.registered(dashboard)
return dash_instance._register(panel)
def unregister_panel(self, dashboard, panel):
dash_instance = self.registered(dashboard)
if not dash_instance:
raise NotRegistered("The dashboard %s is not registered."
% dashboard)
return dash_instance._unregister(panel)
def get_dashboard(self, dashboard):
"""Returns the specified :class:`~horizon.Dashboard` instance."""
return self._registered(dashboard)
def get_dashboards(self):
"""Returns an ordered tuple of :class:`~horizon.Dashboard` modules.
Orders dashboards according to the ``"dashboards"`` key in
``HORIZON_CONFIG`` or else returns all registered dashboards
in alphabetical order.
Any remaining :class:`~horizon.Dashboard` classes registered with
Horizon but not listed in ``HORIZON_CONFIG['dashboards']``
will be appended to the end of the list alphabetically.
"""
if self.dashboards:
registered = copy.copy(self._registry)
dashboards = []
for item in self.dashboards:
dashboard = self._registered(item)
dashboards.append(dashboard)
registered.pop(dashboard.__class__)
if len(registered):
extra = registered.values()
extra.sort()
dashboards.extend(extra)
return dashboards
else:
dashboards = self._registry.values()
dashboards.sort()
return dashboards
def get_default_dashboard(self):
"""Returns the default :class:`~horizon.Dashboard` instance.
If ``"default_dashboard"`` is specified in ``HORIZON_CONFIG``
then that dashboard will be returned. If not, the first dashboard
returned by :func:`~horizon.get_dashboards` will be returned.
"""
if self.default_dashboard:
return self._registered(self.default_dashboard)
elif len(self._registry):
return self.get_dashboards()[0]
else:
raise NotRegistered("No dashboard modules have been registered.")
def get_user_home(self, user):
"""Returns the default URL for a particular user.
This method can be used to customize where a user is sent when
they log in, etc. By default it returns the value of
:meth:`get_absolute_url`.
An alternative function can be supplied to customize this behavior
by specifying a either a URL or a function which returns a URL via
the ``"user_home"`` key in ``HORIZON_CONFIG``. Each of these
would be valid::
{"user_home": "/home",} # A URL
{"user_home": "my_module.get_user_home",} # Path to a function
{"user_home": lambda user: "/" + user.name,} # A function
{"user_home": None,} # Will always return the default dashboard
This can be useful if the default dashboard may not be accessible
to all users. When user_home is missing from HORIZON_CONFIG,
it will default to the settings.LOGIN_REDIRECT_URL value.
"""
user_home = self._conf['user_home']
if user_home:
if callable(user_home):
return user_home(user)
elif isinstance(user_home, basestring):
# Assume we've got a URL if there's a slash in it
if '/' in user_home:
return user_home
else:
mod, func = user_home.rsplit(".", 1)
return getattr(import_module(mod), func)(user)
# If it's not callable and not a string, it's wrong.
raise ValueError('The user_home setting must be either a string '
'or a callable object (e.g. a function).')
else:
return self.get_absolute_url()
def get_absolute_url(self):
"""Returns the default URL for Horizon's URLconf.
The default URL is determined by calling
:meth:`~horizon.Dashboard.get_absolute_url`
on the :class:`~horizon.Dashboard` instance returned by
:meth:`~horizon.get_default_dashboard`.
"""
return self.get_default_dashboard().get_absolute_url()
@property
def _lazy_urls(self):
"""Lazy loading for URL patterns.
This method avoids problems associated with attempting to evaluate
the URLconf before the settings module has been loaded.
"""
def url_patterns():
return self._urls()[0]
return LazyURLPattern(url_patterns), self.namespace, self.slug
def _urls(self):
"""Constructs the URLconf for Horizon from registered Dashboards."""
urlpatterns = self._get_default_urlpatterns()
self._autodiscover()
# Discover each dashboard's panels.
for dash in self._registry.values():
dash._autodiscover()
# Load the plugin-based panel configuration
self._load_panel_customization()
# Allow for override modules
if self._conf.get("customization_module", None):
customization_module = self._conf["customization_module"]
bits = customization_module.split('.')
mod_name = bits.pop()
package = '.'.join(bits)
mod = import_module(package)
try:
before_import_registry = copy.copy(self._registry)
import_module('%s.%s' % (package, mod_name))
except Exception:
self._registry = before_import_registry
if module_has_submodule(mod, mod_name):
raise
# Compile the dynamic urlconf.
for dash in self._registry.values():
urlpatterns += patterns('',
url(r'^%s/' % dash.slug,
include(dash._decorated_urls)))
# Return the three arguments to django.conf.urls.include
return urlpatterns, self.namespace, self.slug
def _autodiscover(self):
"""Discovers modules to register from ``settings.INSTALLED_APPS``.
This makes sure that the appropriate modules get imported to register
themselves with Horizon.
"""
if not getattr(self, '_registerable_class', None):
raise ImproperlyConfigured('You must set a '
'"_registerable_class" property '
'in order to use autodiscovery.')
# Discover both dashboards and panels, in that order
for mod_name in ('dashboard', 'panel'):
for app in settings.INSTALLED_APPS:
mod = import_module(app)
try:
before_import_registry = copy.copy(self._registry)
import_module('%s.%s' % (app, mod_name))
except Exception:
self._registry = before_import_registry
if module_has_submodule(mod, mod_name):
raise
def _load_panel_customization(self):
"""Applies the plugin-based panel configurations.
This method parses the panel customization from the ``HORIZON_CONFIG``
and make changes to the dashboard accordingly.
It supports adding, removing and setting default panels on the
dashboard. It also support registering a panel group.
"""
panel_customization = self._conf.get("panel_customization", [])
# Process all the panel groups first so that they exist before panels
# are added to them and Dashboard._autodiscover() doesn't wipe out any
# panels previously added when its panel groups are instantiated.
panel_configs = []
for config in panel_customization:
if config.get('PANEL'):
panel_configs.append(config)
elif config.get('PANEL_GROUP'):
self._process_panel_group_configuration(config)
else:
LOG.warning("Skipping %s because it doesn't have PANEL or "
"PANEL_GROUP defined.", config.__name__)
# Now process the panels.
for config in panel_configs:
self._process_panel_configuration(config)
def _process_panel_configuration(self, config):
"""Add, remove and set default panels on the dashboard."""
try:
dashboard = config.get('PANEL_DASHBOARD')
if not dashboard:
LOG.warning("Skipping %s because it doesn't have "
"PANEL_DASHBOARD defined.", config.__name__)
return
panel_slug = config.get('PANEL')
dashboard_cls = self.get_dashboard(dashboard)
panel_group = config.get('PANEL_GROUP')
default_panel = config.get('DEFAULT_PANEL')
# Set the default panel
if default_panel:
dashboard_cls.default_panel = default_panel
# Remove the panel
if config.get('REMOVE_PANEL', False):
for panel in dashboard_cls.get_panels():
if panel_slug == panel.slug:
dashboard_cls.unregister(panel.__class__)
elif config.get('ADD_PANEL', None):
# Add the panel to the dashboard
panel_path = config['ADD_PANEL']
mod_path, panel_cls = panel_path.rsplit(".", 1)
try:
mod = import_module(mod_path)
except ImportError:
LOG.warning("Could not load panel: %s", mod_path)
return
panel = getattr(mod, panel_cls)
dashboard_cls.register(panel)
if panel_group:
dashboard_cls.get_panel_group(panel_group).\
panels.append(panel.slug)
else:
panels = list(dashboard_cls.panels)
panels.append(panel)
dashboard_cls.panels = tuple(panels)
except Exception as e:
LOG.warning('Could not process panel %(panel)s: %(exc)s',
{'panel': panel_slug, 'exc': e})
def _process_panel_group_configuration(self, config):
"""Adds a panel group to the dashboard."""
panel_group_slug = config.get('PANEL_GROUP')
try:
dashboard = config.get('PANEL_GROUP_DASHBOARD')
if not dashboard:
LOG.warning("Skipping %s because it doesn't have "
"PANEL_GROUP_DASHBOARD defined.", config.__name__)
return
dashboard_cls = self.get_dashboard(dashboard)
panel_group_name = config.get('PANEL_GROUP_NAME')
if not panel_group_name:
LOG.warning("Skipping %s because it doesn't have "
"PANEL_GROUP_NAME defined.", config.__name__)
return
# Create the panel group class
panel_group = type(panel_group_slug,
(PanelGroup, ),
{'slug': panel_group_slug,
'name': panel_group_name,
'panels': []},)
# Add the panel group to dashboard
panels = list(dashboard_cls.panels)
panels.append(panel_group)
dashboard_cls.panels = tuple(panels)
# Trigger the autodiscovery to completely load the new panel group
dashboard_cls._autodiscover_complete = False
dashboard_cls._autodiscover()
except Exception as e:
LOG.warning('Could not process panel group %(panel_group)s: '
'%(exc)s',
{'panel_group': panel_group_slug, 'exc': e})
class HorizonSite(Site):
"""A singleton implementation of Site such that all dealings with horizon
get the same instance no matter what. There can be only one.
"""
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Site, cls).__new__(cls, *args, **kwargs)
return cls._instance
# The one true Horizon
Horizon = HorizonSite()

View File

@ -1,17 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Importing non-modules that are not used explicitly
from horizon.browsers.base import ResourceBrowser # noqa
from horizon.browsers.views import ResourceBrowserView # noqa

View File

@ -1,145 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django import template
from django.utils.translation import ugettext_lazy as _
from horizon.browsers.breadcrumb import Breadcrumb # noqa
from horizon.tables import DataTable # noqa
from horizon.utils import html
class ResourceBrowser(html.HTMLElement):
"""A class which defines a browser for displaying data.
.. attribute:: name
A short name or slug for the browser.
.. attribute:: verbose_name
A more verbose name for the browser meant for display purposes.
.. attribute:: navigation_table_class
This table displays data on the left side of the browser.
Set the ``navigation_table_class`` attribute with
the desired :class:`~horizon.tables.DataTable` class.
This table class must set browser_table attribute in Meta to
``"navigation"``.
.. attribute:: content_table_class
This table displays data on the right side of the browser.
Set the ``content_table_class`` attribute with
the desired :class:`~horizon.tables.DataTable` class.
This table class must set browser_table attribute in Meta to
``"content"``.
.. attribute:: navigation_kwarg_name
This attribute represents the key of the navigatable items in the
kwargs property of this browser's view.
Defaults to ``"navigation_kwarg"``.
.. attribute:: content_kwarg_name
This attribute represents the key of the content items in the
kwargs property of this browser's view.
Defaults to ``"content_kwarg"``.
.. attribute:: template
String containing the template which should be used to render
the browser. Defaults to ``"horizon/common/_resource_browser.html"``.
.. attribute:: context_var_name
The name of the context variable which will contain the browser when
it is rendered. Defaults to ``"browser"``.
.. attribute:: has_breadcrumb
Indicates if the content table of the browser would have breadcrumb.
Defaults to false.
.. attribute:: breadcrumb_template
This is a template used to render the breadcrumb.
Defaults to ``"horizon/common/_breadcrumb.html"``.
"""
name = None
verbose_name = None
navigation_table_class = None
content_table_class = None
navigation_kwarg_name = "navigation_kwarg"
content_kwarg_name = "content_kwarg"
navigable_item_name = _("Navigation Item")
template = "horizon/common/_resource_browser.html"
context_var_name = "browser"
has_breadcrumb = False
breadcrumb_template = "horizon/common/_breadcrumb.html"
breadcrumb_url = None
def __init__(self, request, tables_dict=None, attrs=None, **kwargs):
super(ResourceBrowser, self).__init__()
self.name = self.name or self.__class__.__name__
self.verbose_name = self.verbose_name or self.name.title()
self.request = request
self.kwargs = kwargs
self.has_breadcrumb = getattr(self, "has_breadcrumb")
if self.has_breadcrumb:
self.breadcrumb_template = getattr(self, "breadcrumb_template")
self.breadcrumb_url = getattr(self, "breadcrumb_url")
if not self.breadcrumb_url:
raise ValueError("You must specify a breadcrumb_url "
"if the has_breadcrumb is set to True.")
self.attrs.update(attrs or {})
self.check_table_class(self.content_table_class, "content_table_class")
self.check_table_class(self.navigation_table_class,
"navigation_table_class")
if tables_dict:
self.set_tables(tables_dict)
def check_table_class(self, cls, attr_name):
if not cls or not issubclass(cls, DataTable):
raise ValueError("You must specify a DataTable subclass for "
"the %s attribute on %s."
% (attr_name, self.__class__.__name__))
def set_tables(self, tables):
"""Sets the table instances on the browser from a dictionary mapping
table names to table instances (as constructed by MultiTableView).
"""
self.navigation_table = tables[self.navigation_table_class._meta.name]
self.content_table = tables[self.content_table_class._meta.name]
navigation_item = self.kwargs.get(self.navigation_kwarg_name)
content_path = self.kwargs.get(self.content_kwarg_name)
if self.has_breadcrumb:
self.prepare_breadcrumb(tables, navigation_item, content_path)
def prepare_breadcrumb(self, tables, navigation_item, content_path):
if self.has_breadcrumb and navigation_item and content_path:
for table in tables.values():
table.breadcrumb = Breadcrumb(self.request,
self.breadcrumb_template,
navigation_item,
content_path,
self.breadcrumb_url)
def render(self):
browser_template = template.loader.get_template(self.template)
extra_context = {self.context_var_name: self}
context = template.RequestContext(self.request, extra_context)
return browser_template.render(context)

View File

@ -1,46 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django import template
from horizon.utils import html
class Breadcrumb(html.HTMLElement):
def __init__(self, request, template, root,
subfolder_path, url, attr=None):
super(Breadcrumb, self).__init__()
self.template = template
self.request = request
self.root = root
self.subfolder_path = subfolder_path
self.url = url
self._subfolders = []
def get_subfolders(self):
if self.subfolder_path and not self._subfolders:
(parent, slash, folder) = self.subfolder_path.strip('/') \
.rpartition('/')
while folder:
path = "%s%s%s/" % (parent, slash, folder)
self._subfolders.insert(0, (folder, path))
(parent, slash, folder) = parent.rpartition('/')
return self._subfolders
def render(self):
"""Renders the table using the template from the table options."""
breadcrumb_template = template.loader.get_template(self.template)
extra_context = {"breadcrumb": self}
context = template.RequestContext(self.request, extra_context)
return breadcrumb_template.render(context)

View File

@ -1,58 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.utils.translation import ugettext_lazy as _
from horizon.tables import MultiTableView # noqa
from horizon.utils import memoized
class ResourceBrowserView(MultiTableView):
browser_class = None
def __init__(self, *args, **kwargs):
if not self.browser_class:
raise ValueError("You must specify a ResourceBrowser subclass "
"for the browser_class attribute on %s."
% self.__class__.__name__)
self.table_classes = (self.browser_class.navigation_table_class,
self.browser_class.content_table_class)
self.navigation_selection = False
super(ResourceBrowserView, self).__init__(*args, **kwargs)
@memoized.memoized_method
def get_browser(self):
browser = self.browser_class(self.request, **self.kwargs)
browser.set_tables(self.get_tables())
if not self.navigation_selection:
ct = browser.content_table
item = browser.navigable_item_name.lower()
ct._no_data_message = _("Select a %s to browse.") % item
return browser
def get_tables(self):
tables = super(ResourceBrowserView, self).get_tables()
# Tells the navigation table what is selected.
navigation_table = tables[
self.browser_class.navigation_table_class._meta.name]
navigation_item = self.kwargs.get(
self.browser_class.navigation_kwarg_name)
navigation_table.current_item_id = navigation_item
return tables
def get_context_data(self, **kwargs):
context = super(ResourceBrowserView, self).get_context_data(**kwargs)
browser = self.get_browser()
context["%s_browser" % browser.name] = browser
return context

View File

@ -1,47 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
from django.utils.functional import empty # noqa
from django.utils.functional import LazyObject # noqa
class LazySettings(LazyObject):
def _setup(self, name=None):
from django.conf import settings
from horizon.conf.default import HORIZON_CONFIG as DEFAULT_CONFIG # noqa
HORIZON_CONFIG = copy.copy(DEFAULT_CONFIG)
HORIZON_CONFIG.update(settings.HORIZON_CONFIG)
# Ensure we always have our exception configuration...
for exc_category in ['unauthorized', 'not_found', 'recoverable']:
if exc_category not in HORIZON_CONFIG['exceptions']:
default_exc_config = DEFAULT_CONFIG['exceptions'][exc_category]
HORIZON_CONFIG['exceptions'][exc_category] = default_exc_config
# Ensure our password validator always exists...
if 'regex' not in HORIZON_CONFIG['password_validator']:
default_pw_regex = DEFAULT_CONFIG['password_validator']['regex']
HORIZON_CONFIG['password_validator']['regex'] = default_pw_regex
if 'help_text' not in HORIZON_CONFIG['password_validator']:
default_pw_help = DEFAULT_CONFIG['password_validator']['help_text']
HORIZON_CONFIG['password_validator']['help_text'] = default_pw_help
self._wrapped = HORIZON_CONFIG
def __getitem__(self, name, fallback=None):
if self._wrapped is empty:
self._setup(name)
return self._wrapped.get(name, fallback)
HORIZON_CONFIG = LazySettings()

View File

@ -1,13 +0,0 @@
from django.utils.translation import ugettext_lazy as _
import horizon
class {{ dash_name|title }}(horizon.Dashboard):
name = _("{{ dash_name|title }}")
slug = "{{ dash_name|slugify }}"
panels = () # Add your panels here.
default_panel = '' # Specify the slug of the dashboard's default panel.
horizon.register({{ dash_name|title }})

View File

@ -1 +0,0 @@
/* Additional CSS for {{ dash_name }}. */

View File

@ -1 +0,0 @@
/* Additional JavaScript for {{ dash_name }}. */

View File

@ -1,11 +0,0 @@
{% load horizon %}{% jstemplate %}[% extends 'base.html' %]
[% block sidebar %]
[% include 'horizon/common/_sidebar.html' %]
[% endblock %]
[% block main %]
[% include "horizon/_messages.html" %]
[% block {{ dash_name }}_main %][% endblock %]
[% endblock %]
{% endjstemplate %}

View File

@ -1,47 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
# Default configuration dictionary. Do not mutate.
HORIZON_CONFIG = {
# Allow for ordering dashboards; list or tuple if provided.
'dashboards': None,
# Name of a default dashboard; defaults to first alphabetically if None
'default_dashboard': None,
# Default redirect url for users' home
'user_home': settings.LOGIN_REDIRECT_URL,
# AJAX settings for JavaScript
'ajax_queue_limit': 10,
'ajax_poll_interval': 2500,
# URL for additional help with this site.
'help_url': None,
# Exception configuration.
'exceptions': {'unauthorized': [],
'not_found': [],
'recoverable': []},
# Password configuration.
'password_validator': {'regex': '.*',
'help_text': _("Password is not accepted")},
'password_autocomplete': 'off',
# Enable or disable simplified floating IP address management.
'simple_ip_management': True
}

View File

@ -1,11 +0,0 @@
from django.utils.translation import ugettext_lazy as _
import horizon
{% if dashboard %}from {{ dash_path }} import dashboard{% endif %}
class {{ panel_name|title }}(horizon.Panel):
name = _("{{ panel_name|title }}")
slug = "{{ panel_name|slugify }}"
{% if dashboard %}
dashboard.{{ dash_name|title }}.register({{ panel_name|title }}){% endif %}

View File

@ -1,12 +0,0 @@
{% load horizon %}{% jstemplate %}[% extends 'base.html' %]
[% load i18n %]
[% block title %][% trans "{{ panel_name|title }}" %][% endblock %]
[% block page_header %]
[% include "horizon/common/_page_header.html" with title=_("{{ panel_name|title }}") %]
[% endblock page_header %]
[% block main %]
[% endblock %]
{% endjstemplate %}

View File

@ -1,7 +0,0 @@
from horizon.test import helpers as test
class {{ panel_name|title }}Tests(test.TestCase):
# Unit tests for {{ panel_name }}.
def test_me(self):
self.assertTrue(1 + 1 == 2)

View File

@ -1,11 +0,0 @@
from django.conf.urls import patterns
from django.conf.urls import url
from {{ dash_path }}.{{ panel_name }}.views \
import IndexView
urlpatterns = patterns(
'',
url(r'^$', IndexView.as_view(), name='index'),
)

View File

@ -1,10 +0,0 @@
from horizon import views
class IndexView(views.APIView):
# A very simple class-based view...
template_name = '{{ dash_name }}/{{ panel_name }}/index.html'
def get_data(self, request, context, *args, **kwargs):
# Add data to the context here...
return context

View File

@ -1,42 +0,0 @@
# Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Context processors used by Horizon.
"""
from horizon import conf
def horizon(request):
"""The main Horizon context processor. Required for Horizon to function.
It adds the Horizon config to the context as well as setting the names
``True`` and ``False`` in the context to their boolean equivalents
for convenience.
.. warning::
Don't put API calls in context processors; they will be called once
for each template/template fragment which takes context that is used
to render the complete output.
"""
context = {"HORIZON_CONFIG": conf.HORIZON_CONFIG,
"True": True,
"False": False}
return context

View File

@ -1,68 +0,0 @@
# Copyright 2014 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Map Horizon languages to datepicker locales
LOCALE_MAPPING = {
'ar': 'ar',
'az': 'az',
'bg': 'bg',
'ca': 'ca',
'cs': 'cs',
'cy': 'cy',
'da': 'da',
'de': 'de',
'el': 'el',
'es': 'es',
'et': 'et',
'fa': 'fa',
'fi': 'fi',
'fr': 'fr',
'gl': 'gl',
'he': 'he',
'hr': 'hr',
'hu': 'hu',
'id': 'id',
'is': 'is',
'it': 'it',
'ja': 'ja',
'ka': 'ka',
'kk': 'kk',
'ko': 'kr', # difference between horizon and datepicker
'lt': 'lt',
'lv': 'lv',
'mk': 'mk',
'ms': 'ms',
'nb': 'nb',
'nl-be': 'nl-BE',
'nl': 'nl',
'no': 'no',
'pl': 'pl',
'pt-br': 'pt-BR',
'pt': 'pt',
'ro': 'ro',
'rs-latin': 'rs-latin',
'sr': 'rs', # difference between horizon and datepicker
'ru': 'ru',
'sk': 'sk',
'sl': 'sl',
'sq': 'sq',
'sv': 'sv',
'sw': 'sw',
'th': 'th',
'tr': 'tr',
'ua': 'ua',
'vi': 'vi',
'zh-cn': 'zh-CN',
'zh-tw': 'zh-TW',
}

View File

@ -1,92 +0,0 @@
# Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 CRS4
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
General-purpose decorators for use with Horizon.
"""
import functools
from django.utils.decorators import available_attrs # noqa
from django.utils.translation import ugettext_lazy as _
def _current_component(view_func, dashboard=None, panel=None):
"""Sets the currently-active dashboard and/or panel on the request."""
@functools.wraps(view_func, assigned=available_attrs(view_func))
def dec(request, *args, **kwargs):
if dashboard:
request.horizon['dashboard'] = dashboard
if panel:
request.horizon['panel'] = panel
return view_func(request, *args, **kwargs)
return dec
def require_auth(view_func):
"""Performs user authentication check.
Similar to Django's `login_required` decorator, except that this throws
:exc:`~horizon.exceptions.NotAuthenticated` exception if the user is not
signed-in.
"""
from horizon.exceptions import NotAuthenticated # noqa
@functools.wraps(view_func, assigned=available_attrs(view_func))
def dec(request, *args, **kwargs):
if request.user.is_authenticated():
return view_func(request, *args, **kwargs)
raise NotAuthenticated(_("Please log in to continue."))
return dec
def require_perms(view_func, required):
"""Enforces permission-based access controls.
:param list required: A tuple of permission names, all of which the request
user must possess in order access the decorated view.
Example usage::
from horizon.decorators import require_perms
@require_perms(['foo.admin', 'foo.member'])
def my_view(request):
...
Raises a :exc:`~horizon.exceptions.NotAuthorized` exception if the
requirements are not met.
"""
from horizon.exceptions import NotAuthorized # noqa
# We only need to check each permission once for a view, so we'll use a set
current_perms = getattr(view_func, '_required_perms', set([]))
view_func._required_perms = current_perms | set(required)
@functools.wraps(view_func, assigned=available_attrs(view_func))
def dec(request, *args, **kwargs):
if request.user.is_authenticated():
if request.user.has_perms(view_func._required_perms):
return view_func(request, *args, **kwargs)
raise NotAuthorized(_("You are not authorized to access %s")
% request.path)
# If we don't have any permissions, just return the original view.
if required:
return dec
else:
return view_func

View File

@ -1,365 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Exceptions raised by the Horizon code and the machinery for handling them.
"""
import logging
import os
import sys
import six
from django.core.management import color_style # noqa
from django.http import HttpRequest # noqa
from django.utils import encoding
from django.utils.translation import ugettext_lazy as _
from django.views.debug import CLEANSED_SUBSTITUTE # noqa
from django.views.debug import SafeExceptionReporterFilter # noqa
from horizon.conf import HORIZON_CONFIG # noqa
from horizon import messages
LOG = logging.getLogger(__name__)
class HorizonReporterFilter(SafeExceptionReporterFilter):
"""Error report filter that's always active, even in DEBUG mode."""
def is_active(self, request):
return True
# TODO(gabriel): This bugfix is cribbed from Django's code. When 1.4.1
# is available we can remove this code.
def get_traceback_frame_variables(self, request, tb_frame):
"""Replaces the values of variables marked as sensitive with
stars (*********).
"""
# Loop through the frame's callers to see if the sensitive_variables
# decorator was used.
current_frame = tb_frame.f_back
sensitive_variables = None
while current_frame is not None:
if (current_frame.f_code.co_name ==
'sensitive_variables_wrapper' and
'sensitive_variables_wrapper'
in current_frame.f_locals):
# The sensitive_variables decorator was used, so we take note
# of the sensitive variables' names.
wrapper = current_frame.f_locals['sensitive_variables_wrapper']
sensitive_variables = getattr(wrapper,
'sensitive_variables',
None)
break
current_frame = current_frame.f_back
cleansed = []
if self.is_active(request) and sensitive_variables:
if sensitive_variables == '__ALL__':
# Cleanse all variables
for name, value in tb_frame.f_locals.items():
cleansed.append((name, CLEANSED_SUBSTITUTE))
return cleansed
else:
# Cleanse specified variables
for name, value in tb_frame.f_locals.items():
if name in sensitive_variables:
value = CLEANSED_SUBSTITUTE
elif isinstance(value, HttpRequest):
# Cleanse the request's POST parameters.
value = self.get_request_repr(value)
cleansed.append((name, value))
return cleansed
else:
# Potentially cleanse only the request if it's one of the
# frame variables.
for name, value in tb_frame.f_locals.items():
if isinstance(value, HttpRequest):
# Cleanse the request's POST parameters.
value = self.get_request_repr(value)
cleansed.append((name, value))
return cleansed
class HorizonException(Exception):
"""Base exception class for distinguishing our own exception classes."""
pass
class Http302(HorizonException):
"""Error class which can be raised from within a handler to cause an
early bailout and redirect at the middleware level.
"""
status_code = 302
def __init__(self, location, message=None):
self.location = location
self.message = message
class NotAuthorized(HorizonException):
"""Raised whenever a user attempts to access a resource which they do not
have permission-based access to (such as when failing the
:func:`~horizon.decorators.require_perms` decorator).
The included :class:`~horizon.middleware.HorizonMiddleware` catches
``NotAuthorized`` and handles it gracefully by displaying an error
message and redirecting the user to a login page.
"""
status_code = 401
class NotAuthenticated(HorizonException):
"""Raised when a user is trying to make requests and they are not logged
in.
The included :class:`~horizon.middleware.HorizonMiddleware` catches
``NotAuthenticated`` and handles it gracefully by displaying an error
message and redirecting the user to a login page.
"""
status_code = 403
class NotFound(HorizonException):
"""Generic error to replace all "Not Found"-type API errors."""
status_code = 404
class Conflict(HorizonException):
"""Generic error to replace all "Conflict"-type API errors."""
status_code = 409
class RecoverableError(HorizonException):
"""Generic error to replace any "Recoverable"-type API errors."""
status_code = 100 # HTTP status code "Continue"
class ServiceCatalogException(HorizonException):
"""Raised when a requested service is not available in the
``ServiceCatalog`` returned by Keystone.
"""
def __init__(self, service_name):
message = 'Invalid service catalog service: %s' % service_name
super(ServiceCatalogException, self).__init__(message)
class AlreadyExists(HorizonException):
"""Exception to be raised when trying to create an API resource which
already exists.
"""
def __init__(self, name, resource_type):
self.attrs = {"name": name, "resource": resource_type}
self.msg = _('A %(resource)s with the name "%(name)s" already exists.')
def __repr__(self):
return self.msg % self.attrs
def __str__(self):
return self.msg % self.attrs
def __unicode__(self):
return self.msg % self.attrs
class ConfigurationError(HorizonException):
"""Exception to be raised when invalid settings have been provided."""
pass
class NotAvailable(HorizonException):
"""Exception to be raised when something is not available."""
pass
class WorkflowError(HorizonException):
"""Exception to be raised when something goes wrong in a workflow."""
pass
class WorkflowValidationError(HorizonException):
"""Exception raised during workflow validation if required data is missing,
or existing data is not valid.
"""
pass
class HandledException(HorizonException):
"""Used internally to track exceptions that have gone through
:func:`horizon.exceptions.handle` more than once.
"""
def __init__(self, wrapped):
self.wrapped = wrapped
UNAUTHORIZED = tuple(HORIZON_CONFIG['exceptions']['unauthorized'])
NOT_FOUND = tuple(HORIZON_CONFIG['exceptions']['not_found'])
RECOVERABLE = (AlreadyExists, Conflict, NotAvailable, ServiceCatalogException)
RECOVERABLE += tuple(HORIZON_CONFIG['exceptions']['recoverable'])
def error_color(msg):
return color_style().ERROR_OUTPUT(msg)
def check_message(keywords, message):
"""Checks an exception for given keywords and raises a new ``ActionError``
with the desired message if the keywords are found. This allows selective
control over API error messages.
"""
exc_type, exc_value, exc_traceback = sys.exc_info()
if set(str(exc_value).split(" ")).issuperset(set(keywords)):
exc_value._safe_message = message
raise
def handle_unauthorized(request, message, redirect, ignore, escalate, handled,
force_silence, force_log,
log_method, log_entry, log_level):
if ignore:
return NotAuthorized
if not force_silence and not handled:
log_method(error_color("Unauthorized: %s" % log_entry))
if not handled:
if message:
message = _("Unauthorized: %s") % message
# We get some pretty useless error messages back from
# some clients, so let's define our own fallback.
fallback = _("Unauthorized. Please try logging in again.")
messages.error(request, message or fallback)
# Escalation means logging the user out and raising NotAuthorized
# so the middleware will redirect them appropriately.
if escalate:
# Prevents creation of circular import. django.contrib.auth
# requires openstack_dashboard.settings to be loaded (by trying to
# access settings.CACHES in in django.core.caches) while
# openstack_dashboard.settings requires django.contrib.auth to be
# loaded while importing openstack_auth.utils
from django.contrib.auth import logout # noqa
logout(request)
raise NotAuthorized
# Otherwise continue and present our "unauthorized" error message.
return NotAuthorized
def handle_notfound(request, message, redirect, ignore, escalate, handled,
force_silence, force_log,
log_method, log_entry, log_level):
if not force_silence and not handled and (not ignore or force_log):
log_method(error_color("Not Found: %s" % log_entry))
if not ignore and not handled:
messages.error(request, message or log_entry)
if redirect:
raise Http302(redirect)
if not escalate:
return NotFound # return to normal code flow
def handle_recoverable(request, message, redirect, ignore, escalate, handled,
force_silence, force_log,
log_method, log_entry, log_level):
if not force_silence and not handled and (not ignore or force_log):
# Default recoverable error to WARN log level
log_method = getattr(LOG, log_level or "warning")
log_method(error_color("Recoverable error: %s" % log_entry))
if not ignore and not handled:
messages.error(request, message or log_entry)
if redirect:
raise Http302(redirect)
if not escalate:
return RecoverableError # return to normal code flow
HANDLE_EXC_METHODS = [
{'exc': UNAUTHORIZED, 'handler': handle_unauthorized, 'set_wrap': False},
{'exc': NOT_FOUND, 'handler': handle_notfound, 'set_wrap': True},
{'exc': RECOVERABLE, 'handler': handle_recoverable, 'set_wrap': True},
]
def handle(request, message=None, redirect=None, ignore=False,
escalate=False, log_level=None, force_log=None):
"""Centralized error handling for Horizon.
Because Horizon consumes so many different APIs with completely
different ``Exception`` types, it's necessary to have a centralized
place for handling exceptions which may be raised.
Exceptions are roughly divided into 3 types:
#. ``UNAUTHORIZED``: Errors resulting from authentication or authorization
problems. These result in being logged out and sent to the login screen.
#. ``NOT_FOUND``: Errors resulting from objects which could not be
located via the API. These generally result in a user-facing error
message, but are otherwise returned to the normal code flow. Optionally
a redirect value may be passed to the error handler so users are
returned to a different view than the one requested in addition to the
error message.
#. RECOVERABLE: Generic API errors which generate a user-facing message
but drop directly back to the regular code flow.
All other exceptions bubble the stack as normal unless the ``ignore``
argument is passed in as ``True``, in which case only unrecognized
errors are bubbled.
If the exception is not re-raised, an appropriate wrapper exception
class indicating the type of exception that was encountered will be
returned.
"""
exc_type, exc_value, exc_traceback = sys.exc_info()
log_method = getattr(LOG, log_level or "exception")
force_log = force_log or os.environ.get("HORIZON_TEST_RUN", False)
force_silence = getattr(exc_value, "silence_logging", False)
# Because the same exception may travel through this method more than
# once (if it's re-raised) we may want to treat it differently
# the second time (e.g. no user messages/logging).
handled = issubclass(exc_type, HandledException)
wrap = False
# Restore our original exception information, but re-wrap it at the end
if handled:
exc_type, exc_value, exc_traceback = exc_value.wrapped
wrap = True
log_entry = encoding.force_text(exc_value)
# We trust messages from our own exceptions
if issubclass(exc_type, HorizonException):
message = exc_value
# Check for an override message
elif getattr(exc_value, "_safe_message", None):
message = exc_value._safe_message
# If the message has a placeholder for the exception, fill it in
elif message and "%(exc)s" in message:
message = encoding.force_text(message) % {"exc": log_entry}
if message:
message = encoding.force_text(message)
for exc_handler in HANDLE_EXC_METHODS:
if issubclass(exc_type, exc_handler['exc']):
if exc_handler['set_wrap']:
wrap = True
handler = exc_handler['handler']
ret = handler(request, message, redirect, ignore, escalate,
handled, force_silence, force_log,
log_method, log_entry, log_level)
if ret:
return ret # return to normal code flow
# If we've gotten here, time to wrap and/or raise our exception.
if wrap:
raise HandledException([exc_type, exc_value, exc_traceback])
six.reraise(exc_type, exc_value, exc_traceback)

View File

@ -1,76 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Importing non-modules that are not used explicitly
# FIXME(gabriel): Legacy imports for API compatibility.
from django.core.exceptions import ValidationError # noqa
from django.forms.fields import * # noqa
from django.forms.forms import * # noqa
from django.forms import widgets
from django.forms.widgets import * # noqa
# Convenience imports for public API components.
from horizon.forms.base import DateForm # noqa
from horizon.forms.base import SelfHandlingForm # noqa
from horizon.forms.base import SelfHandlingMixin # noqa
from horizon.forms.fields import DynamicChoiceField # noqa
from horizon.forms.fields import DynamicTypedChoiceField # noqa
from horizon.forms.fields import IPField # noqa
from horizon.forms.fields import IPv4 # noqa
from horizon.forms.fields import IPv6 # noqa
from horizon.forms.fields import MultiIPField # noqa
from horizon.forms.fields import SelectWidget # noqa
from horizon.forms.views import ModalFormMixin # noqa
from horizon.forms.views import ModalFormView # noqa
__all__ = [
"SelfHandlingMixin",
"SelfHandlingForm",
"DateForm",
"ModalFormView",
"ModalFormMixin",
"DynamicTypedChoiceField",
"DynamicChoiceField",
"IPField",
"IPv4",
"IPv6",
"MultiIPField",
"SelectWidget"
# From django.forms
"ValidationError",
# From django.forms.fields
'Field', 'CharField', 'IntegerField', 'DateField', 'TimeField',
'DateTimeField', 'TimeField', 'RegexField', 'EmailField', 'FileField',
'ImageField', 'URLField', 'BooleanField', 'NullBooleanField',
'ChoiceField', 'MultipleChoiceField', 'ComboField', 'MultiValueField',
'FloatField', 'DecimalField', 'SplitDateTimeField', 'IPAddressField',
'GenericIPAddressField', 'FilePathField', 'SlugField', 'TypedChoiceField',
'TypedMultipleChoiceField',
# From django.forms.widgets
"widgets",
'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput',
'HiddenInput', 'MultipleHiddenInput', 'ClearableFileInput', 'FileInput',
'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
# From django.forms.forms
'BaseForm', 'Form',
]

View File

@ -1,62 +0,0 @@
# Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django import forms
from django.forms.forms import NON_FIELD_ERRORS # noqa
class SelfHandlingMixin(object):
def __init__(self, request, *args, **kwargs):
self.request = request
if not hasattr(self, "handle"):
raise NotImplementedError("%s does not define a handle method."
% self.__class__.__name__)
super(SelfHandlingMixin, self).__init__(*args, **kwargs)
class SelfHandlingForm(SelfHandlingMixin, forms.Form):
"""A base :class:`Form <django:django.forms.Form>` class which includes
processing logic in its subclasses.
"""
required_css_class = 'required'
def api_error(self, message):
"""Adds an error to the form's error dictionary after validation
based on problems reported via the API. This is useful when you
wish for API errors to appear as errors on the form rather than
using the messages framework.
"""
self._errors[NON_FIELD_ERRORS] = self.error_class([message])
def set_warning(self, message):
"""Sets a warning on the form.
Unlike NON_FIELD_ERRORS, this doesn't fail form validation.
"""
self.warnings = self.error_class([message])
class DateForm(forms.Form):
"""A simple form for selecting a range of time."""
start = forms.DateField(input_formats=("%Y-%m-%d",))
end = forms.DateField(input_formats=("%Y-%m-%d",))
def __init__(self, *args, **kwargs):
super(DateForm, self).__init__(*args, **kwargs)
self.fields['start'].widget.attrs['data-date-format'] = "yyyy-mm-dd"
self.fields['end'].widget.attrs['data-date-format'] = "yyyy-mm-dd"

View File

@ -1,253 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import re
import netaddr
from django.core.exceptions import ValidationError # noqa
from django.core import urlresolvers
from django.forms import fields
from django.forms.util import flatatt # noqa
from django.forms import widgets
from django.utils.encoding import force_text
from django.utils.functional import Promise # noqa
from django.utils import html
from django.utils.translation import ugettext_lazy as _
ip_allowed_symbols_re = re.compile(r'^[a-fA-F0-9:/\.]+$')
IPv4 = 1
IPv6 = 2
class IPField(fields.Field):
"""Form field for entering IP/range values, with validation.
Supports IPv4/IPv6 in the format:
.. xxx.xxx.xxx.xxx
.. xxx.xxx.xxx.xxx/zz
.. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
.. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/zz
and all compressed forms. Also the short forms
are supported:
xxx/yy
xxx.xxx/yy
.. attribute:: version
Specifies which IP version to validate,
valid values are 1 (fields.IPv4), 2 (fields.IPv6) or
both - 3 (fields.IPv4 | fields.IPv6).
Defaults to IPv4 (1)
.. attribute:: mask
Boolean flag to validate subnet masks along with IP address.
E.g: 10.0.0.1/32
.. attribute:: mask_range_from
Subnet range limitation, e.g. 16
That means the input mask will be checked to be in the range
16:max_value. Useful to limit the subnet ranges
to A/B/C-class networks.
"""
invalid_format_message = _("Incorrect format for IP address")
invalid_version_message = _("Invalid version for IP address")
invalid_mask_message = _("Invalid subnet mask")
max_v4_mask = 32
max_v6_mask = 128
def __init__(self, *args, **kwargs):
self.mask = kwargs.pop("mask", None)
self.min_mask = kwargs.pop("mask_range_from", 0)
self.version = kwargs.pop('version', IPv4)
super(IPField, self).__init__(*args, **kwargs)
def validate(self, value):
super(IPField, self).validate(value)
if not value and not self.required:
return
try:
if self.mask:
self.ip = netaddr.IPNetwork(value)
else:
self.ip = netaddr.IPAddress(value)
except Exception:
raise ValidationError(self.invalid_format_message)
if not any([self.version & IPv4 > 0 and self.ip.version == 4,
self.version & IPv6 > 0 and self.ip.version == 6]):
raise ValidationError(self.invalid_version_message)
if self.mask:
if self.ip.version == 4 and \
not self.min_mask <= self.ip.prefixlen <= self.max_v4_mask:
raise ValidationError(self.invalid_mask_message)
if self.ip.version == 6 and \
not self.min_mask <= self.ip.prefixlen <= self.max_v6_mask:
raise ValidationError(self.invalid_mask_message)
def clean(self, value):
super(IPField, self).clean(value)
return str(getattr(self, "ip", ""))
class MultiIPField(IPField):
"""Extends IPField to allow comma-separated lists of addresses."""
def validate(self, value):
self.addresses = []
if value:
addresses = value.split(',')
for ip in addresses:
super(MultiIPField, self).validate(ip)
self.addresses.append(ip)
else:
super(MultiIPField, self).validate(value)
def clean(self, value):
super(MultiIPField, self).clean(value)
return str(','.join(getattr(self, "addresses", [])))
class SelectWidget(widgets.Select):
"""Customizable select widget, that allows to render
data-xxx attributes from choices. This widget also
allows user to specify additional html attributes
for choices.
.. attribute:: data_attrs
Specifies object properties to serialize as
data-xxx attribute. If passed ('id', ),
this will be rendered as:
<option data-id="123">option_value</option>
where 123 is the value of choice_value.id
.. attribute:: transform
A callable used to render the display value
from the option object.
.. attribute:: transform_html_attrs
A callable used to render additional HTML attributes
for the option object. It returns a dictionary
containing the html attributes and their values.
For example, to define a title attribute for the
choices:
helpText = { 'Apple': 'This is a fruit',
'Carrot': 'This is a vegetable' }
def get_title(data):
text = helpText.get(data, None)
if text:
return {'title': text}
else:
return {}
....
....
widget=forms.SelectWidget( attrs={'class': 'switchable',
'data-slug': 'source'},
transform_html_attrs=get_title )
self.fields[<field name>].choices =
([
('apple','Apple'),
('carrot','Carrot')
])
"""
def __init__(self, attrs=None, choices=(), data_attrs=(), transform=None,
transform_html_attrs=None):
self.data_attrs = data_attrs
self.transform = transform
self.transform_html_attrs = transform_html_attrs
super(SelectWidget, self).__init__(attrs, choices)
def render_option(self, selected_choices, option_value, option_label):
option_value = force_text(option_value)
other_html = (u' selected="selected"'
if option_value in selected_choices else '')
if callable(self.transform_html_attrs):
html_attrs = self.transform_html_attrs(option_label)
other_html += flatatt(html_attrs)
if not isinstance(option_label, (basestring, Promise)):
for data_attr in self.data_attrs:
data_value = html.conditional_escape(
force_text(getattr(option_label,
data_attr, "")))
other_html += ' data-%s="%s"' % (data_attr, data_value)
if callable(self.transform):
option_label = self.transform(option_label)
return u'<option value="%s"%s>%s</option>' % (
html.escape(option_value), other_html,
html.conditional_escape(force_text(option_label)))
class DynamicSelectWidget(widgets.Select):
"""A subclass of the ``Select`` widget which renders extra attributes for
use in callbacks to handle dynamic changes to the available choices.
"""
_data_add_url_attr = "data-add-item-url"
def render(self, *args, **kwargs):
add_item_url = self.get_add_item_url()
if add_item_url is not None:
self.attrs[self._data_add_url_attr] = add_item_url
return super(DynamicSelectWidget, self).render(*args, **kwargs)
def get_add_item_url(self):
if callable(self.add_item_link):
return self.add_item_link()
try:
if self.add_item_link_args:
return urlresolvers.reverse(self.add_item_link,
args=self.add_item_link_args)
else:
return urlresolvers.reverse(self.add_item_link)
except urlresolvers.NoReverseMatch:
return self.add_item_link
class DynamicChoiceField(fields.ChoiceField):
"""A subclass of ``ChoiceField`` with additional properties that make
dynamically updating its elements easier.
Notably, the field declaration takes an extra argument, ``add_item_link``
which may be a string or callable defining the URL that should be used
for the "add" link associated with the field.
"""
widget = DynamicSelectWidget
def __init__(self,
add_item_link=None,
add_item_link_args=None,
*args,
**kwargs):
super(DynamicChoiceField, self).__init__(*args, **kwargs)
self.widget.add_item_link = add_item_link
self.widget.add_item_link_args = add_item_link_args
class DynamicTypedChoiceField(DynamicChoiceField, fields.TypedChoiceField):
"""Simple mix of ``DynamicChoiceField`` and ``TypedChoiceField``."""
pass

View File

@ -1,196 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import json
import os
from django.conf import settings
from django import http
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import views
ADD_TO_FIELD_HEADER = "HTTP_X_HORIZON_ADD_TO_FIELD"
class ModalBackdropMixin(object):
"""This mixin class is to be used for together with ModalFormView and
WorkflowView classes to augment them with modal_backdrop context data.
.. attribute: modal_backdrop (optional)
The appearance and behavior of backdrop under the modal element.
Possible options are:
* 'true' - show backdrop element outside the modal, close the modal
after clicking on backdrop (the default one);
* 'false' - do not show backdrop element, do not close the modal after
clicking outside of it;
* 'static' - show backdrop element outside the modal, do not close
the modal after clicking on backdrop.
"""
modal_backdrop = 'static'
def __init__(self):
super(ModalBackdropMixin, self).__init__()
config = getattr(settings, 'HORIZON_CONFIG', {})
if 'modal_backdrop' in config:
self.modal_backdrop = config['modal_backdrop']
def get_context_data(self, **kwargs):
context = super(ModalBackdropMixin, self).get_context_data(**kwargs)
context['modal_backdrop'] = self.modal_backdrop
return context
class ModalFormMixin(object):
def get_template_names(self):
if self.request.is_ajax():
if not hasattr(self, "ajax_template_name"):
# Transform standard template name to ajax name (leading "_")
bits = list(os.path.split(self.template_name))
bits[1] = "".join(("_", bits[1]))
self.ajax_template_name = os.path.join(*bits)
template = self.ajax_template_name
else:
template = self.template_name
return template
def get_context_data(self, **kwargs):
context = super(ModalFormMixin, self).get_context_data(**kwargs)
if self.request.is_ajax():
context['hide'] = True
if ADD_TO_FIELD_HEADER in self.request.META:
context['add_to_field'] = self.request.META[ADD_TO_FIELD_HEADER]
return context
class ModalFormView(ModalBackdropMixin, ModalFormMixin, views.HorizonFormView):
"""The main view class from which all views which handle forms in Horizon
should inherit. It takes care of all details with processing
:class:`~horizon.forms.base.SelfHandlingForm` classes, and modal concerns
when the associated template inherits from
`horizon/common/_modal_form.html`.
Subclasses must define a ``form_class`` and ``template_name`` attribute
at minimum.
See Django's documentation on the `FormView <https://docs.djangoproject.com
/en/dev/ref/class-based-views/generic-editing/#formview>`_ class for
more details.
.. attribute: modal_id (recommended)
The HTML element id of this modal.
.. attribute: modal_header (recommended)
The title of this modal.
.. attribute: form_id (recommended)
The HTML element id of the form in this modal.
.. attribute: submit_url (required)
The url for a submit action.
.. attribute: submit_label (optional)
The label for the submit button. This label defaults to ``Submit``.
This button should only be visible if the action_url is defined.
Clicking on this button will post to the action_url.
.. attribute: cancel_label (optional)
The label for the cancel button. This label defaults to ``Cancel``.
Clicking on this button will redirect user to the cancel_url.
.. attribute: cancel_url (optional)
The url for a cancel action. This url defaults to the success_url
if omitted. Note that the cancel_url redirect is nullified when
shown in a modal dialog.
"""
modal_id = None
modal_header = ""
form_id = None
submit_url = None
submit_label = _("Submit")
cancel_label = _("Cancel")
cancel_url = None
def get_context_data(self, **kwargs):
context = super(ModalFormView, self).get_context_data(**kwargs)
context['modal_id'] = self.modal_id
context['modal_header'] = self.modal_header
context['form_id'] = self.form_id
context['submit_url'] = self.submit_url
context['submit_label'] = self.submit_label
context['cancel_label'] = self.cancel_label
context['cancel_url'] = self.get_cancel_url()
return context
def get_cancel_url(self):
return self.cancel_url or self.success_url
def get_object_id(self, obj):
"""For dynamic insertion of resources created in modals, this method
returns the id of the created object. Defaults to returning the ``id``
attribute.
"""
return obj.id
def get_object_display(self, obj):
"""For dynamic insertion of resources created in modals, this method
returns the display name of the created object. Defaults to returning
the ``name`` attribute.
"""
return obj.name
def get_form(self, form_class):
"""Returns an instance of the form to be used in this view."""
return form_class(self.request, **self.get_form_kwargs())
def form_valid(self, form):
try:
handled = form.handle(self.request, form.cleaned_data)
except Exception:
handled = None
exceptions.handle(self.request)
if handled:
if ADD_TO_FIELD_HEADER in self.request.META:
field_id = self.request.META[ADD_TO_FIELD_HEADER]
data = [self.get_object_id(handled),
self.get_object_display(handled)]
response = http.HttpResponse(json.dumps(data))
response["X-Horizon-Add-To-Field"] = field_id
elif isinstance(handled, http.HttpResponse):
return handled
else:
success_url = self.get_success_url()
response = http.HttpResponseRedirect(success_url)
# TODO(gabriel): This is not a long-term solution to how
# AJAX should be handled, but it's an expedient solution
# until the blueprint for AJAX handling is architected
# and implemented.
response['X-Horizon-Location'] = success_url
return response
else:
# If handled didn't return, we can assume something went
# wrong, and we should send back the form as-is.
return self.form_invalid(form)

View File

@ -1,68 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Wrapper for loading templates from "templates" directories in panel modules.
"""
import os
import django
from django.conf import settings
from django.template.base import TemplateDoesNotExist # noqa
if django.get_version() >= '1.8':
from django.template.engine import Engine
from django.template.loaders.base import Loader as tLoaderCls
else:
from django.template.loader import BaseLoader as tLoaderCls # noqa
from django.utils._os import safe_join # noqa
# Set up a cache of the panel directories to search.
panel_template_dirs = {}
class TemplateLoader(tLoaderCls):
is_usable = True
def get_template_sources(self, template_name):
bits = template_name.split('/', 2)
if len(bits) == 3:
dash_name, panel_name, remainder = bits
key = os.path.join(dash_name, panel_name)
if key in panel_template_dirs:
template_dir = panel_template_dirs[key]
try:
yield safe_join(template_dir, panel_name, remainder)
except UnicodeDecodeError:
# The template dir name wasn't valid UTF-8.
raise
except ValueError:
# The joined path was located outside of template_dir.
pass
def load_template_source(self, template_name, template_dirs=None):
for path in self.get_template_sources(template_name):
try:
with open(path) as file:
return (file.read().decode(settings.FILE_CHARSET), path)
except IOError:
pass
raise TemplateDoesNotExist(template_name)
if django.get_version() >= '1.8':
e = Engine()
_loader = TemplateLoader(e)
else:
_loader = TemplateLoader()

View File

@ -1,512 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Andreas Jaeger <jaegerandi@gmail.com>, 2014
# Robert Simai, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-01 22:52+0000\n"
"Last-Translator: Robert Simai\n"
"Language-Team: German (http://www.transifex.com/projects/p/horizon/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: base.py:475
msgid "Other"
msgstr "Andere"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Navigations-Eintrag"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Wähle %s zum Durchsuchen."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Password wurde nicht akzeptiert"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Bitte melden Sie sich an um fortzufahren."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "Sie sind nicht berechtigt für den Zugriff auf %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "Ein(e) %(resource)s mit dem Namen \"%(name)s\" existiert bereits."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "Nicht berechtigt: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Nicht autorisiert. Bitte melden Sie sich erneut an."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Ungültiges Format der IP-Adresse"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Ungültige Version der IP-Adresse"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Ungültige Subnetzmaske"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Abschicken"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Abbrechen"
#: middleware.py:103
msgid "Session timed out."
msgstr "Die Sitzung ist abgelaufen."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filter"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "Sie haben keine Berechtigung für %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Nicht möglich: %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Löschen"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Gelöscht"
#: tables/actions.py:948
msgid "Update"
msgstr "Aktualisieren"
#: tables/actions.py:949
msgid "Updated"
msgstr "Aktualisiert"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "Das Attribut %(attr)s existiert nicht für %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "Keine Einträge zum anzeigen."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Aktionen"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "Keine Übereinstimmung für die ID \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Bitte wählen Sie vor dem Ausführen dieser Aktion eine Zeile aus."
#: tables/base.py:1570
msgid "N/A"
msgstr "Nicht verfügbar"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Angemeldet als: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Hilfe"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Abmelden"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\nWenn Sie nicht sicher sind, welche Authentifizierungsmethode zu verwenden ist, kontaktieren Sie Ihren Administrator."
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Anmelden"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "Sie haben keine Zugriffsrechte auf die Ressource:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Melden Sie sich als anderer Benutzer an oder gehen Sie zurück auf die <a href=\"%(home_url)s\"> Startseite</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Anmelden"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Verbinden"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Login"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Information:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Warnung:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Erfolg:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Fehler:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Zusammenfassung"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Zeige %(counter)s Eintrag"
msgstr[1] "Zeige %(counter)s Einträge"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Zurück"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Weiter&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "Weitere Aktionen"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Eine Zeile hinzufügen"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Übersicht Begrenzungen"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instanzen"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(used)s </span> von <span> %(available)s </span> benutzt"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPUs"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "Floating IPs"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(used)s </span> von <span> %(available)s </span> zugewiesen"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Sicherheitsgruppen"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Datenträger"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Datenträger-Speicher"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Speichern"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Zeige %(nav_items)s Eintrag"
msgstr[1] "Zeige %(nav_items)s Einträge"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Zeige %(content_items)s Eintrag"
msgstr[1] "Zeige %(content_items)s Einträge"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Nutzungsübersicht"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Wählen Sie einen Zeitbereich, um die Auslastung abzurufen:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>Von:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>Bis:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "Das Datum sollte im YYYY-mm-dd Format sein."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Aktive Instanzen:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "Aktiver RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "VCPU-Stunden in diesem Zeitraum:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "GB-Stunden in diesem Zeitraum:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "RAM-Stunden in diesem Zeitraum:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Zurück"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Weiter"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "Keine Begrenzung"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Verfügbar"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d Byte"
msgstr[1] "%(size)d Bytes"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Bytes"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "Sell Puppy"
msgstr[1] "Sell Puppies"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "Sold Puppy"
msgstr[1] "Sold Puppies"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Fälschung"
#: utils/filters.py:49
msgid "Never"
msgstr "Niemals"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Keine gültige Port-Nummer"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Keine gültige IP-Protokollnummer"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "Im Port-Bereich ist nur ein Doppelpunkt erlaubt"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Port-Nummer muss ganzzahlig sein"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "Die Zeichenkette darf nur druckbare ASCII-Zeichen enthalten."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Verarbeite..."
#: workflows/base.py:475
msgid "All available"
msgstr "Alle verfügbaren"
#: workflows/base.py:476
msgid "Members"
msgstr "Mitglieder"
#: workflows/base.py:477
msgid "None available."
msgstr "Keine verfügbar."
#: workflows/base.py:478
msgid "No members."
msgstr "Keine Mitglieder."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s erfolgreich abgeschlossen."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s nicht abgeschlossen."

View File

@ -1,621 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Andreas Jaeger <jaegerandi@gmail.com>, 2015
# Ettore Atalan <atalanttore@googlemail.com>, 2015
# Robert Simai, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-11 11:47-0500\n"
"PO-Revision-Date: 2015-04-12 03:25+0000\n"
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
"Language-Team: German (http://www.transifex.com/projects/p/horizon/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "Die Aktion kann nicht ausgeführt werden. Der Inhalt dieser Spalte enthält Fehler oder es fehlen Informationen."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Detail-Informationen"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "Sie können Ressourcen-Metadaten bestimmen, indem Sie Positionen aus der linken Spalte in die rechte bewegen. In der linken Spalte finden Sie Metadaten-Definitionen aus dem Glace Metadaten-Katalog. Verwenden Sie die \"Andere\" Option, um Metadaten mit dem Schlüssel Ihrer Wahl hinzuzufügen."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Min"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Max"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Minimale Länge"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Maximale Länge"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Muster-Übereinstimmungsfehler"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Ganzzahl erforderlich"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Dezimalzahl erforderlich"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Erforderlich"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Doppelte Schlüssel sind nicht erlaubt"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filter"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Verfügbare Metadaten"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Vorhandene Metadaten"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Angepasst"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "Keine Metadaten vorhanden"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "Keine existierenden Metadaten"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Abschicken"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Abbrechen"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Zugewiesen"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Verfügbar"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Eines auswählen"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Wählen Sie einen Eintrag aus den verfügbaren Positionen aus"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "Keine verfügbaren Positionen"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Erweitern, um zugewiesene Positionen zu sehen"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Erweitern, um verfügbare Positionen zu sehen"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Klicken zum zeigen oder verbergen"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Umsortieren der Positionen durch ziehen und ablegen"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Klicken um mehr Details zu sehen"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "%(found)s von %(total)s gefunden"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Klicken Sie hier um die Zeile zu erweitern und die Fehler zu sehen."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Zurück"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Weiter"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Beenden"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Verbinde"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Öffnen"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Schließen"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Geschlossen"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Status: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Ja"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "Nein"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s Bytes"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Zeige %s Eintrag"
msgstr[1] "Zeige %s Einträge"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Datenträger können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Datenträger-Schattenkopien können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Benutzerkonfiguration kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Admin-Konfiguration kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Einstellungen können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Einstellung ist nicht aktiviert: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Abbild kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Abbilder können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Namensräume können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Benutzer können nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Benutzer kann nicht angelegt werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Benutzer können nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Aktuelle Benutzersitzung kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Benutzer kann nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Benutzer kann nicht bearbeitet werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Benutzer kann nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Rolle kann nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Die Rolle kann nicht erstellt werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Die Rollen können nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Die Rolle kann nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Die Rolle kann nicht bearbeitet werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Die Rolle kann nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Domänen können nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Die Domäne kann nicht erstellt werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Die Domänen können nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Die Domäne kann nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Die Domäne kann nicht bearbeitet werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Die Domäne kann nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Projekte können nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Das Projekt kann nicht erstellt werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Die Projekte können nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Das Projekt kann nicht abgerufen werden"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Das Projekt kann nicht bearbeitet werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Das Projekt kann nicht gelöscht werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Die Rolle kann nicht gewährt werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Die Dienstekatalog kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Dienst-Typ ist nicht aktiviert: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Dienstekatalog kann nicht von Keystone abgerufen werden."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Netzwerke können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Netzwerk kann nicht angelegt werden."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Subnetze können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Subnetz kann nicht erzeugt werden."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Ports können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Schlüsselpaare können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Das Schlüsselpaar kann nicht importiert werden."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Das Schlüsselpaar kann nicht erstellt werden."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Verfügbarkeitszonen können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Begrenzungen können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Der Server kann nicht erstellt werden."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Server kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Erweiterungen können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Varianten können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Variante kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Extraspezifikationen zur Variante können nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Nicht aktivierte Erweiterung: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Liste der Nova-Erweiterungen kann nicht abgerufen werden."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Richtlinienüberprüfung fehlgeschlagen."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Sicherheitsgruppen können nicht abgerufen werden."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Lade"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "Keine Daten verfügbar."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "Es gab ein Problem bei der Kommunikation mit dem Server. Bitte versuchen Sie es noch einmal."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Die Datei konnte nicht gelesen werden"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Das Passwort konnte nicht entschlüsselt werden"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Keine Rollen"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Rollen"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Gefahr:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Warnung:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Nachricht:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Erfolg:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Fehler:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "In Arbeit"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "Es gab einen Fehler beim Abschicken des Formulars. Bitte versuchen Sie es noch einmal."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "Keine"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Löschen"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUS"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Schnittstellen"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Schnittstelle löschen"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Konsole öffnen"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "Details anzeigen"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Router löschen"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "Router-Details anzeigen"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Schnittstelle hinzufügen"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Instanz terminieren"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "Instanz-Details anzeigen"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "Kein Eintrag zum anzeigen."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "Ein Fehler ist beim Aktualisieren aufgetreten."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "Sie haben %s ausgewählt."
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "%s bestätigen"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Bitte bestätigen Sie Ihre Auswahl."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Keine Berechtigung für diese Aktion."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Die Passwörter stimmen nicht überein."

View File

@ -1,510 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-07 01:16-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: base.py:475
msgid "Other"
msgstr ""
#: browsers/base.py:88
msgid "Navigation Item"
msgstr ""
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr ""
#: conf/default.py:41
msgid "Password is not accepted"
msgstr ""
#: decorators.py:53
msgid "Please log in to continue."
msgstr ""
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr ""
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr ""
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr ""
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr ""
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr ""
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr ""
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr ""
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr ""
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr ""
#: middleware.py:103
msgid "Session timed out."
msgstr ""
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr ""
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr ""
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr ""
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr ""
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr ""
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr ""
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr ""
#: tables/actions.py:915
msgid "Delete"
msgstr ""
#: tables/actions.py:917
msgid "Deleted"
msgstr ""
#: tables/actions.py:948
msgid "Update"
msgstr ""
#: tables/actions.py:949
msgid "Updated"
msgstr ""
#: tables/base.py:305
msgid "-"
msgstr ""
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr ""
#: tables/base.py:990
msgid "No items to display."
msgstr ""
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr ""
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr ""
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr ""
#: tables/base.py:1570
msgid "N/A"
msgstr ""
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr ""
#: templates/_header.html:7
msgid "Help"
msgstr ""
#: templates/_header.html:9
msgid "Sign Out"
msgstr ""
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your "
"administrator.\n"
" "
msgstr ""
#: templates/auth/_login.html:5
msgid "Log In"
msgstr ""
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr ""
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home page</a>"
msgstr ""
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr ""
#: templates/auth/_login.html:46
msgid "Connect"
msgstr ""
#: templates/auth/login.html:4
msgid "Login"
msgstr ""
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr ""
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr ""
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr ""
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr ""
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr ""
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] ""
msgstr[1] ""
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr ""
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr ""
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr ""
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr ""
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr ""
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr ""
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr ""
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr ""
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr ""
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr ""
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr ""
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr ""
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr ""
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr ""
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr ""
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr ""
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr ""
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] ""
msgstr[1] ""
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] ""
msgstr[1] ""
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr ""
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr ""
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr ""
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr ""
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr ""
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr ""
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr ""
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr ""
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr ""
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr ""
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr ""
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr ""
#: templatetags/branding.py:34
msgid "Horizon"
msgstr ""
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr ""
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr ""
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] ""
msgstr[1] ""
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr ""
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr ""
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr ""
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr ""
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr ""
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr ""
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] ""
msgstr[1] ""
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] ""
msgstr[1] ""
#: test/tests/views.py:59
msgid "Fake"
msgstr ""
#: utils/filters.py:49
msgid "Never"
msgstr ""
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr ""
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr ""
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr ""
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr ""
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr ""
#: workflows/base.py:71
msgid "Processing..."
msgstr ""
#: workflows/base.py:475
msgid "All available"
msgstr ""
#: workflows/base.py:476
msgid "Members"
msgstr ""
#: workflows/base.py:477
msgid "None available."
msgstr ""
#: workflows/base.py:478
msgid "No members."
msgstr ""
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr ""
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr ""

View File

@ -1,618 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr ""
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr ""
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr ""
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr ""
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr ""
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr ""
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr ""
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr ""
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr ""
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr ""
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr ""
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr ""
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr ""
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] ""
msgstr[1] ""
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr ""
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr ""
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr ""
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr ""
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr ""
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr ""
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr ""
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr ""
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr ""
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr ""
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr ""
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr ""
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr ""
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr ""
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr ""
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr ""
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr ""
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr ""
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr ""
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr ""
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr ""
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr ""
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr ""
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr ""
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr ""
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr ""
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr ""
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr ""
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr ""
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr ""
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr ""
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr ""
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr ""
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr ""
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr ""
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr ""
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr ""
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr ""
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr ""
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr ""

View File

@ -1,511 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Tom Fifield <tom@openstack.org>, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-07 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:07+0000\n"
"Last-Translator: Tom Fifield <tom@openstack.org>\n"
"Language-Team: English (Australia) (http://www.transifex.com/projects/p/horizon/language/en_AU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_AU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: base.py:475
msgid "Other"
msgstr "Other"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Navigation Item"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Select a %s to browse."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Password is not accepted"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Please log in to continue."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "You are not authorised to access %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "A %(resource)s with the name \"%(name)s\" already exists."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "Unauthorised: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Unauthorised. Please try logging in again."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Incorrect format for IP address"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Invalid version for IP address"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Invalid subnet mask"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Submit"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Cancel"
#: middleware.py:103
msgid "Session timed out."
msgstr "Session timed out."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filter"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "This action cannot be undone."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "You are not allowed to %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Unable to %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Delete"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Deleted"
#: tables/actions.py:948
msgid "Update"
msgstr "Update"
#: tables/actions.py:949
msgid "Updated"
msgstr "Updated"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "The attribute %(attr)s doesn't exist on %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "No items to display."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Actions"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "No match returned for the id \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Please select a row before taking that action."
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Logged in as: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Help"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Sign Out"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n If you are not sure which authentication method to use, contact your administrator.\n "
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Log In"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "You do not have permission to access the resource:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Login as different user or go back to <a href=\"%(home_url)s\"> home page</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Sign In"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Connect"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Login"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Info: "
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Warning: "
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Success: "
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Error: "
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Summary"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Displaying %(counter)s item"
msgstr[1] "Displaying %(counter)s items"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Prev"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Next&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "More Actions"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Add a row"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Limit Summary"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instances"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Used <span> %(used)s </span> of <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPUs"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "Floating IPs"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Security Groups"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Volumes"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Volume Storage"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Save"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Displaying %(nav_items)s item"
msgstr[1] "Displaying %(nav_items)s items"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Displaying %(content_items)s item"
msgstr[1] "Displaying %(content_items)s items"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Usage Summary"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Select a period of time to query its usage:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>From:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>To:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "The date should be in YYYY-mm-dd format."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Active Instances:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "Active RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "This Period's VCPU-Hours:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "This Period's GB-Hours:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "This Period's RAM-Hours:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Back"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Next"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "No Limit"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Available"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d Byte"
msgstr[1] "%(size)d Bytes"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Bytes"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "Sell Puppy"
msgstr[1] "Sell Puppies"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "Sold Puppy"
msgstr[1] "Sold Puppies"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Fake"
#: utils/filters.py:49
msgid "Never"
msgstr "Never"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Not a valid port number"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Not a valid IP protocol number"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "One colon allowed in port range"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Port number must be integer"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "The string may only contain ASCII printable characters."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Processing..."
#: workflows/base.py:475
msgid "All available"
msgstr "All available"
#: workflows/base.py:476
msgid "Members"
msgstr "Members"
#: workflows/base.py:477
msgid "None available."
msgstr "None available."
#: workflows/base.py:478
msgid "No members."
msgstr "No members."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s completed successfully."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s did not complete."

View File

@ -1,619 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Tom Fifield <tom@openstack.org>, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:06+0000\n"
"Last-Translator: Tom Fifield <tom@openstack.org>\n"
"Language-Team: English (Australia) (http://www.transifex.com/projects/p/horizon/language/en_AU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_AU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "The action cannot be performed. The contents of this row have errors or are missing information."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Detail Information"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "You can specify resource metadata by moving items from the left column to the right column. In the left columns there are metadata definitions from the Glance Metadata Catalog. Use the \"Other\" option to add metadata with the key of your choice."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Min"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Max"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Min length"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Max length"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Pattern mismatch"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Integer required"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Decimal required"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Required"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Duplicate keys are not allowed"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filter"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Available Metadata"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Existing Metadata"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Custom"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "No available metadata"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "No existing metadata"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Submit"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Cancel"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Allocated"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Available"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Select one"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Select an item from Available items below"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "No available items"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Expand to see allocated items"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Expand to see available items"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Click to show or hide"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Re-order items using drag and drop"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Click to see more details"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "Found %(found)s of %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Click here to expand the row and view the errors."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Back"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Next"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Finish"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Connecting"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Open"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Closing"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Closed"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Status: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Yes"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "No"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s bytes"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Displaying %s item"
msgstr[1] "Displaying %s items"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Unable to retrieve volumes."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Unable to retrieve volume snapshots."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Unable to retrieve user configuration."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Unable to retrieve admin configuration."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Unable to retrieve settings."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Setting is not enabled: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Unable to retrieve image."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Unable to retrieve images."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Unable to retrieve namespaces."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Unable to retrieve users"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Unable to create the user."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Unable to delete the users."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Unable to retrieve the current user session."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Unable to retrieve the user"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Unable to edit the user."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Unable to delete the user."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Unable to retrieve role"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Unable to create the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Unable to delete the roles."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Unable to retrieve the role"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Unable to edit the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Unable to delete the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Unable to retrieve domains"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Unable to create the domain."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Unable to delete the domains."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Unable to retrieve the domain"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Unable to edit the domain."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Unable to delete the domain."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Unable to retrieve projects"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Unable to create the project."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Unable to delete the projects."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Unable to retrieve the project"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Unable to edit the project."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Unable to delete the project."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Unable to grant the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Unable to fetch the service catalog."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Service type is not enabled: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Cannot get service catalog from keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Unable to retrieve networks."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Unable to create the network."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Unable to retrieve subnets."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Unable to create the subnet."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Unable to retrieve ports."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Unable to retrieve keypairs."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Unable to import the keypair."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Unable to create the keypair."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Unable to retrieve availability zones."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Unable to retrieve limits."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Unable to create the server."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Unable to retrieve server."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Unable to retrieve extensions."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Unable to retrieve flavors."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Unable to retrieve flavor."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Unable to retrieve flavor extra specs."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Extension is not enabled: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Cannot get nova extension list."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Policy check failed."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Unable to retrieve security groups."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Loading"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "No data available."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "An error occurred. Please try again later."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "There was a problem communicating with the server, please try again."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Could not read the file"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Could not decrypt the password"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "No roles"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Roles"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Danger: "
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Warning: "
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Notice: "
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Success: "
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Error: "
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Working"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "There was an error submitting the form. Please try again."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "None"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Delete"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUS"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Interfaces"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Delete Interface"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Open Console"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "View Details"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Delete Router"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "View Router Details"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Add Interface"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Terminate Instance"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "View Instance Details"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "No items to display."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "An error occurred while updating."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "You have selected %s. "
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Confirm %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Please confirm your selection. "
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Not authorised to do this operation."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Passwords do not match."

View File

@ -1,512 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Andi Chandler <andi@gowling.com>, 2014
# Rob Cresswell <robert.cresswell@outlook.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-05 15:01+0000\n"
"Last-Translator: Rob Cresswell <robert.cresswell@outlook.com>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/horizon/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: base.py:475
msgid "Other"
msgstr "Other"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Navigation Item"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Select a %s to browse."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Password is not accepted"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Please log in to continue."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "You are not authorised to access %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "A %(resource)s with the name \"%(name)s\" already exists."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "Unauthorised: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Unauthorised. Please try logging in again."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Incorrect format for IP address"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Invalid version for IP address"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Invalid subnet mask"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Submit"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Cancel"
#: middleware.py:103
msgid "Session timed out."
msgstr "Session timed out."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filter"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "This action cannot be undone."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "You are not allowed to %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Unable to %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Delete"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Deleted"
#: tables/actions.py:948
msgid "Update"
msgstr "Update"
#: tables/actions.py:949
msgid "Updated"
msgstr "Updated"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "The attribute %(attr)s does not exist on %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "No items to display."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Actions"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "No match returned for the id \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Please select a row before taking that action."
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Logged in as: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Help"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Sign Out"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n If you are not sure which authentication method to use, contact your administrator.\n "
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Log In"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "You do not have permission to access the resource:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Login as different user or go back to <a href=\"%(home_url)s\"> home page</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Sign In"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Connect"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Login"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Info: "
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Warning: "
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Success: "
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Error: "
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Summary"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Displaying %(counter)s item"
msgstr[1] "Displaying %(counter)s items"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Prev"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Next&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "More Actions"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Add a row"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Limit Summary"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instances"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Used <span> %(used)s </span> of <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPUs"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "Floating IPs"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Security Groups"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Volumes"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Volume Storage"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Save"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Displaying %(nav_items)s item"
msgstr[1] "Displaying %(nav_items)s items"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Displaying %(content_items)s item"
msgstr[1] "Displaying %(content_items)s items"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Usage Summary"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Select a period of time to query its usage:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>From:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>To:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "The date should be in YYYY-mm-dd format."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Active Instances:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "Active RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "This Period's VCPU-Hours:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "This Period's GB-Hours:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "This Period's RAM-Hours:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Back"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Next"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "No Limit"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Available"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d Byte"
msgstr[1] "%(size)d Bytes"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Bytes"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] ""
msgstr[1] "Sell Puppies"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] ""
msgstr[1] "Sold Puppies"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Fake"
#: utils/filters.py:49
msgid "Never"
msgstr "Never"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Not a valid port number"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Not a valid IP protocol number"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "One colon allowed in port range"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Port number must be integer"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "The string may only contain ASCII printable characters."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Processing..."
#: workflows/base.py:475
msgid "All available"
msgstr "All available"
#: workflows/base.py:476
msgid "Members"
msgstr "Members"
#: workflows/base.py:477
msgid "None available."
msgstr "None available."
#: workflows/base.py:478
msgid "No members."
msgstr "No members."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s completed successfully."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s did not complete."

View File

@ -1,620 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Andi Chandler <andi@gowling.com>, 2014
# Rob Cresswell <robert.cresswell@outlook.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 16:36-0500\n"
"PO-Revision-Date: 2015-04-13 07:52+0000\n"
"Last-Translator: Rob Cresswell <robert.cresswell@outlook.com>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/horizon/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "The action cannot be performed. The contents of this row have errors or are missing information."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Detail Information"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "You can specify resource metadata by moving items from the left column to the right column. In the left columns there are metadata definitions from the Glance Metadata Catalog. Use the \"Other\" option to add metadata with the key of your choice."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Min"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Max"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Min length"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Max length"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Pattern mismatch"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Integer required"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Decimal required"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Required"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Duplicate keys are not allowed"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filter"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Available Metadata"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Existing Metadata"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Custom"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "No available metadata"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "No existing metadata"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Submit"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Cancel"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Allocated"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Available"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Select one"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Select an item from Available items below"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "No available items"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Expand to see allocated items"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Expand to see available items"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Click to show or hide"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Re-order items using drag and drop"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Click to see more details"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "Found %(found)s of %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Click here to expand the row and view the errors."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Back"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Next"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Finish"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Connecting"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Open"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Closing"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Closed"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Status: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Yes"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "No"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s bytes"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Displaying %s item"
msgstr[1] "Displaying %s items"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Unable to retrieve volumes."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Unable to retrieve volume snapshots."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Unable to retrieve user configuration."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Unable to retrieve admin configuration."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Unable to retrieve settings."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Setting is not enabled: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Unable to retrieve image."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Unable to retrieve images."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Unable to retrieve namespaces."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Unable to retrieve users"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Unable to create the user."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Unable to delete the users."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Unable to retrieve the current user session."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Unable to retrieve the user"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Unable to edit the user."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Unable to delete the user."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Unable to retrieve role"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Unable to create the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Unable to delete the roles."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Unable to retrieve the role"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Unable to edit the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Unable to delete the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Unable to retrieve domains"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Unable to create the domain."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Unable to delete the domains."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Unable to retrieve the domain"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Unable to edit the domain."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Unable to delete the domain."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Unable to retrieve projects"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Unable to create the project."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Unable to delete the projects."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Unable to retrieve the project"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Unable to edit the project."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Unable to delete the project."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Unable to grant the role."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Unable to fetch the service catalogue."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Service type is not enabled: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Cannot get service catalogue from keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Unable to retrieve networks."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Unable to create the network."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Unable to retrieve subnets."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Unable to create the subnet."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Unable to retrieve ports."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Unable to retrieve keypairs."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Unable to import the keypair."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Unable to create the keypair."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Unable to retrieve availability zones."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Unable to retrieve limits."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Unable to create the server."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Unable to retrieve server."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Unable to retrieve extensions."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Unable to retrieve flavours."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Unable to retrieve flavour."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Unable to retrieve flavour extra specs."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Extension is not enabled: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Cannot get nova extension list."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Policy check failed."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Unable to retrieve security groups."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Loading"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "No data available."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "An error occurred. Please try again later."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "There was a problem communicating with the server, please try again."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Could not read the file"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Could not decrypt the password"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "No roles"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Roles"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Danger: "
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Warning: "
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Notice: "
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Success: "
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Error: "
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Working"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "There was an error submitting the form. Please try again."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "None"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Delete"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUS"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Interfaces"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Delete Interface"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Open Console"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "View Details"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Delete Router"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "View Router Details"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Add Interface"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Terminate Instance"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "View Instance Details"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "No items to display."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "An error occurred while updating."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "You have selected %s. "
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Confirm %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Please confirm your selection. "
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Not authorised to do this operation."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Passwords do not match."

View File

@ -1,514 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Alberto Molina Coballes <alb.molina@gmail.com>, 2015
# cametiope <aldohcasa@hotmail.com>, 2014
# Orizhial <contact@prunier.es>, 2015
# Marian Tort <marian.tort@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-07 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:07+0000\n"
"Last-Translator: Alberto Molina Coballes <alb.molina@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/horizon/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: base.py:475
msgid "Other"
msgstr "Otro"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Ítem de navegación"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Seleccione una %s para navegar."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "La contraseña no se ha aceptado"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Inicie sesión para continuar."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "No está autorizado para acceder a %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "Un %(resource)s con el nombre \"%(name)s\" ya existe."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "No autorizado: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "No autorizado. Inicie sesión de nuevo."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Formato de dirección IP incorrecto"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Versión de dirección IP no válida"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Máscara de red no válida"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Enviar"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Cancelar "
#: middleware.py:103
msgid "Session timed out."
msgstr "La sesión ha expirado."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filtrar"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "No se puede deshacer esta acción."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "No le está permitido %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "No ha sido posible %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Eliminar"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Eliminado"
#: tables/actions.py:948
msgid "Update"
msgstr "Actualizar"
#: tables/actions.py:949
msgid "Updated"
msgstr "Actualizada"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "El atributo %(attr)s no existe en %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "No hay ítems que mostrar."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Acciones"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "Ninguna coincidencia para el id \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Seleccione una fila antes de realizar la acción."
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Sesión iniciada como: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Ayuda"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Salir"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\nSi no está seguro del método de autenticación a utilizar, contacte con su administrador."
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Iniciar sesión"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "No tiene permisos para acceder al recurso:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Inicie sesión con otro usuario o volver a la <a href=\"%(home_url)s\"> página de inicio</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Iniciar sesión"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Conectar"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Usuario"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Info:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Advertencia:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Correcto:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Error: "
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Resumen"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Mostrando %(counter)s articulo"
msgstr[1] "Mostrando %(counter)s articulos"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Prev"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Siguiente&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "Más acciones"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Agregar una fila"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Resumen"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instancias"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(used)s </span> usado de <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPU"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "IPs flotantes"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Asignados <span> %(used)s </span> de <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Grupos de seguridad"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Volúmenes"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Almacenamiento de volúmenes"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Guardar"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Mostrando %(nav_items)s articulo"
msgstr[1] "Mostrando %(nav_items)s articulos"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Mostrando %(content_items)s articulo"
msgstr[1] "Mostrando %(content_items)s articulos"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Resumen del uso"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Seleccione un periodo de tiempo para consultar su uso: "
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>De:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>A:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "La fecha debe estar en formato AAAA-MM-DD."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Instancias activas:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "RAM activa:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "Este periodo en horas VCPU:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "Este periodo en horas GB:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "Horas-RAM de este periodo:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Anterior"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Siguiente"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "Sin límite"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Disponible"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d bite"
msgstr[1] "%(size)d bites"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Bytes"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "Vender Mascota"
msgstr[1] "Vender Mascotas"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "Mascota Vendida"
msgstr[1] "Mascotas Vendidas"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Falso"
#: utils/filters.py:49
msgid "Never"
msgstr "Nunca"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Número de puerto no válido"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Número de protocolo IP no válido"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "Un punto permitido en el rango de puerto"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "El número de puerto debe ser un entero"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "La cadena sólo puede incluir caracteres imprimibles ASCII."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Procesando..."
#: workflows/base.py:475
msgid "All available"
msgstr "Todos los disponibles"
#: workflows/base.py:476
msgid "Members"
msgstr "Miembros"
#: workflows/base.py:477
msgid "None available."
msgstr "Ninguno disponible."
#: workflows/base.py:478
msgid "No members."
msgstr "Sin miembros."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s completado correctamente."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s no completado."

View File

@ -1,621 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Alberto Molina Coballes <alb.molina@gmail.com>, 2015
# cametiope <aldohcasa@hotmail.com>, 2014
# Marian Tort <marian.tort@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:06+0000\n"
"Last-Translator: Alberto Molina Coballes <alb.molina@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/horizon/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "Esta acción no se puede llevar a cabo. Esta columna contiene errores o carece de información."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Información detallada"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "Puede especificar los metadatos de los recursos moviendo los ítems de la columna de la izquierda a la de la derecha. En las columnas de la izquierda hay definiciones de metadatos del Glance Metadata Catalog. Utilice la opcion \"Otro\" para añadir metadatos con la clave que desee. "
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Mín."
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Máx."
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Longitud mín."
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Longitud máx."
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Discrepancia en el patrón"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Entero obligatorio"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Decimal obligatorio"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Obligatorio"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Las claves duplicadas no están permitidas"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filtrar"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Metadatos disponibles"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Metadatos existentes"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Personalizar"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "Metadatos no disponibles"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "No hay metadatos existentes"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Enviar"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Cancelar "
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Asignados"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Disponible"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Seleccione uno"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Seleccione un ítem de los disponibles abajo"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "No hay ítems disponibles"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Expandir para ver los ítems asociados"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Expandir para ver los ítems disponibles"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Haga click para mostrar u ocultar"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Reordene los ítems arrastrando y soltando."
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Haga click para ver más detalles"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "%(found)s de %(total)s encontrado"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Haga click aquí para ver los errores."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Anterior"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Siguiente"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Finalizar"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Conectando"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Abierta"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Cerrando"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Cerrada"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Estado: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Sí"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "No"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s bytes"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Mostrando %s articulo"
msgstr[1] "Mostrando %s articulos"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "No ha sido posible obtener volúmenes."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "No ha sido posible obtener las snapshots de volúmenes."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "No ha sido posible obtener la configuración de usuario."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "No ha sido posible obtener la configuración de admin."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "No ha sido posible obtener los ajustes."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Ajuste no habilitado: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "No ha sido posible obtener la imagen."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "No ha sido posible obtener las imágenes."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "No ha sido posible obtener los espacios de nombres."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "No ha sido posible obtener los usuarios"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "No ha sido posible crear el usuario."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "No ha sido posible borrar los usuarios."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "No ha sido posible obtener la sesión de usuario actual."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "No ha sido posible obtener el usuario"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "No ha sido posible editar el usuario."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "No ha sido posible borrar el usuario."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "No ha sido posible obtener el rol"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "No ha sido posible crear el rol."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "No ha sido posible borrar los roles."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "No ha sido posible obtener el rol"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "No ha sido posible editar el rol."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "No ha sido posible borrar el rol."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "No ha sido posible obtener los dominios"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "No ha sido posible crear el dominio."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "No ha sido posible borrar los dominios."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "No ha sido posible obtener el dominio"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "No ha sido posible editar el dominio."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "No ha sido posible borrar el dominio."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "No ha sido posible obtener los proyectos"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "No ha sido posible crear el proyecto."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "No ha sido posible borrar los proyectos."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "No ha sido posible obtener el proyecto"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "No ha sido posible editar el proyecto."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "No ha sido posible borrar el proyecto."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "No ha sido posible asignar el rol."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "No ha sido posible obtener el catálogo de servicios."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Tipo de servicio no habilitado: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "No se puede obtener el catálogo de servicios desde keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "No ha sido posible obtener las redes."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "No ha sido posible crear la red."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "No ha sido posible obtener las subredes."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "No ha sido posible crear la subred."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "No ha sido posible obtener los puertos."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "No ha sido posible obtener los pares de claves."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "No ha sido posible importar el par de claves."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "No ha sido posible crear el par de claves."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "No ha sido posible obtener las zonas de disponibilidad."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "No ha sido posible obtener los límites."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "No ha sido posible crear el servidor."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "No ha sido posible obtener el servidor."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "No ha sido posible obtener las extensiones."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "No ha sido posible obtener los sabores."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "No ha sido posible obtener el sabor."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "No ha sido posible obtener las especificaciones extra del sabor."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Extensión no habilitada: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "No se puede obtener la lista de extensiones de nova."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Ha fallado la comprobación de política."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "No ha sido posible obtener los grupos de seguridad."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Cargando"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "No hay datos disponibles."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "Ha ocurrido un error. Inténtelo de nuevo más tarde."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "Ha ocurrido un problema en la comunicación con el servidor, inténtelo de nuevo."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "No se ha podido leer el fichero"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "No se ha podido descifrar la contraseña"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Sin roles"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Roles"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Peligro:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Advertencia:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Aviso:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Correcto:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Error: "
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Trabajando"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "Ha ocurrido un error al enviar el formulario. Inténtelo de nuevo."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "Ninguno"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Eliminar"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "ESTADO"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Interfaces"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Eliminar interfaz"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Abrir consola"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "Ver detalles"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Eliminar router"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "Ver detalles del router"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Añadir interfaz"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Terminar instancia"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "Ver detalles de la instancia"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "No hay ítems que mostrar."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "Ha ocurrido un error durante la actualización."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "Ha seleccionado %s."
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Confirmar %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Confirme su selección."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "No tiene autorización para realizar esta operación."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Las contraseñas no coinciden."

View File

@ -1,514 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Bruno Cornec <bruno.cornec@hp.com>, 2015
# François Bureau, 2015
# Frédéric <frosmont@free.fr>, 2014
# Maxime COQUEREL <max.coquerel@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-03 13:28+0000\n"
"Last-Translator: François Bureau\n"
"Language-Team: French (http://www.transifex.com/projects/p/horizon/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: base.py:475
msgid "Other"
msgstr "Autre"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Elément de navigation"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Sélectionner une %s à parcourir."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Le mot de passe n'est pas accepté"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Merci de vous connecter pour continuer."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "Vous n'êtes pas autorisé à accéder à %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "Des %(resource)s avec le nom \"%(name)s\" existent déjà."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "%s : non autorisé"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Accès non autorisé. Merci de vous reconnecter."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Format d'adresse IP incorrect"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Version d'adresse IP invalide"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Masque de sous-réseau invalide"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Envoyer"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Annuler"
#: middleware.py:103
msgid "Session timed out."
msgstr "La session a expiré."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filtrer"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "Cette action ne peut pas être réalisée."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "Vous n'êtes pas autorisé à %(action)s : %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Impossible de %(action)s : %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s : %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Supprimer"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Supprimée"
#: tables/actions.py:948
msgid "Update"
msgstr "Mettre à jour"
#: tables/actions.py:949
msgid "Updated"
msgstr "Mis à jour"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "L'attribut %(attr)s n'existe pas sur %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "Aucun élément à afficher."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Actions"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "Aucun résultat retourné pour l'id \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Merci de sélectionner une ligne avant de faire cette action."
#: tables/base.py:1570
msgid "N/A"
msgstr "N/D"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Utilisateur connecté : %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Aide"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Se déconnecter"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\nSi vous n'êtes pas sûr de la méthode d'identification à utiliser, veuillez contacter votre administrateur"
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Se connecter"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "Vous n'avez pas la permission d'accéder à la ressource :"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Connectez-vous avec un autre nom d'utilisateur ou revenez à <a href=\"%(home_url)s\"> la page daccueil</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Se connecter"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Connection"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Identifiant"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Information :"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Avertissement :"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Succès :"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Erreur :"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Résumé"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Affichage de %(counter)s item"
msgstr[1] "Affichage de %(counter)s items"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Aperçu"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Suivant&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "Plus d'Actions"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s : "
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Ajouter une ligne"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s : %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Synthèse des Quotas"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instances"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(used)s </span> utilisé(es) sur <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPUs"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "IP flottantes"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Alloué <span> %(used)s </span> de <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Groupes de sécurité"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Volumes"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Stockage de volumes"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Enregistrer"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Affichage de l'item %(nav_items)s"
msgstr[1] "Affichage des items %(nav_items)s"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Affichage de l'item %(content_items)s"
msgstr[1] "Affichage des items %(content_items)s"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Résumé de l'Utilisation"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Sélectionnez une période de temps pour interroger son utilisation :"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n<label>Du :</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n<label>au :</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "La date doit être au format AAAA-mm-jj"
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Instances Actives :"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "RAM Active :"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "VCPU-Heures de cette Période :"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "GB-Heures de cette période :"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "Dans cette période RAM-Heures:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Retour"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Suivant"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "Pas de limite"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "disponible(s)"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d Octet"
msgstr[1] "%(size)d Octets"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s Ko"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s Mo"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s Go"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s To"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s Po"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Octets"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "Chiot à vendre"
msgstr[1] "Chiots à vendre"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "Chiot vendu"
msgstr[1] "Chiots Vendus"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Faux"
#: utils/filters.py:49
msgid "Never"
msgstr "Jamais"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Numéro de port invalide"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Numéro de protocole IP invalide "
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "Un seul caractère deux-points autorisé dans une plage de ports"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Le numéro de port doit être un nombre entier"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "La chaîne ne peut contenir que des caractères ASCII imprimables."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Traitement en cours..."
#: workflows/base.py:475
msgid "All available"
msgstr "Disponibles"
#: workflows/base.py:476
msgid "Members"
msgstr "Membres"
#: workflows/base.py:477
msgid "None available."
msgstr "Aucun disponible."
#: workflows/base.py:478
msgid "No members."
msgstr "Aucun membre."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s terminé avec succès."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s ne s'est pas terminé."

View File

@ -1,627 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# alexandre ignjatovic <alexandre.ignjatovic@gmail.com>, 2015
# Bruno Cornec <bruno.cornec@hp.com>, 2015
# Corina Roe <croe@redhat.com>, 2015
# EVEILLARD <stephane.eveillard@gmail.com>, 2015
# François Bureau, 2015
# Frédéric <frosmont@free.fr>, 2014
# JF Taltavull <jftalta@gmail.com>, 2015
# Maxime COQUEREL <max.coquerel@gmail.com>, 2015
# Patte D <pattedeph@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: 2015-04-23 12:36+0000\n"
"Last-Translator: JF Taltavull <jftalta@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/horizon/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "L'action n'a pas pu être effectuée. Le contenu de cette ligne contient des erreurs ou des informations manquantes."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Informations détaillées"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "Vous pouvez spécifier les ressources de métadonnées en déplaçant les éléments de la colonne de gauche vers la colonne de droite. Les colonnes de gauche contiennent des définitions de métadonnées du Catalogue de métadonnées Glance. Utiliser l'option \"Autre\" pour ajouter des métadonnées avec la clé de votre choix."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Min"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Max"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Longueur mini"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Longueur max"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Modèle ne correspondant pas"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Entier requis"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Nombre décimal requis"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Requis"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Les clés dupliquées ne sont pas autorisées"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filtrer"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Métadonnées disponibles"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Métadonnées existantes"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Personnaliser"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "Pas de métadonnées disponibles"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "Pas de métadonnées existantes"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Envoyer"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Annuler"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Alloué"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "disponible(s)"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Sélectionner un"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Sélectionner un élément depuis les éléments disponibles ci-dessous"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "Pas d'élément disponible"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Développer pour voir les éléments alloués"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Développer pour voir les éléments disponibles"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Cliquer pour montrer ou cacher"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Ordonnancer les éléments à nouveau en utilisant l'opération glisser-déplacer"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Cliquer pour une vue plus détaillée"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "Résultat %(found)s parmi %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Cliquez ici pour étendre la ligne et voir les erreurs"
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Retour"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Suivant"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Terminer"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "En cours de connexion"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Ouvert"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "En cours de fermeture"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Fermé"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "État : %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Oui"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "Non"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s Go"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s Mo"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s To"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s Ko"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s octets"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Affichage de %s élément"
msgstr[1] "Affichage de %s éléments"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Impossible de récupérer les volumes."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Impossible de récupérer les instantanés de volume."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Impossible de récupérer la configuration utilisateur."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Impossible d'extraire la configuration admin."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Impossible de récupérer les paramètres."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Le paramètre n'est pas activé : %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Impossible de récupérer l'image."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Impossible de récupérer les images."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Impossible de récupérer les espaces de nommage"
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Impossible de récupérer les utilisateurs"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Impossible de créer l'utilisateur."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Impossible de supprimer les utilisateurs."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Impossible de récupérer les informations de session de l'utilisateur courant."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Impossible de récupérer l'utilisateur"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Impossible d'éditer l'utilisateur"
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Impossible de supprimer l'utilisateur."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Impossible de récupérer le rôle."
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Impossible de créer le rôle."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Impossible de supprimer les rôles."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Impossible de récupérer le rôle."
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Impossible d'éditer le rôle."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Impossible de supprimer le rôle."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Impossible de récupérer les domaines."
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Impossible de créer le domaine."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Impossible de supprimer les domaines."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Impossible de récupérer le domaine."
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Impossible d'éditer le domaine."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Impossible de supprimer le domaine."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Impossible de récupérer les projets."
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Impossible de créer le projet."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Impossible de supprimer les projets."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Impossible de récupérer le projet."
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Impossible d'éditer le projet."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Impossible de supprimer le projet."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Impossible d'accorder le rôle"
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Impossible d'extraire le catalogue de services."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Type de service non activé: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Impossible d'obtenir le catalogue de services Keystone"
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Impossible de récupérer les réseaux."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Impossible de créer le réseau."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Impossible de récupérer les sous-réseaux."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Impossible de créer le sous-réseau."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Impossible de récupérer les ports."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Impossible de récupérer les paires de clés."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Impossible d'importer la paire de clés."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Impossible de créer la paire de clés"
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Impossible de récupérer les zones de disponibilité."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Impossible de récupérer les limites."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Impossible de créer le serveur."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Impossible de récupérer le serveur."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Impossible d'obtenir les extensions."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Impossible de récupérer les gabarits."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Impossible de récupérer le gabarit."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Impossible de récupérer les paramètres supplémentaires du gabarit."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "L'extension n'est pas activée : %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Impossible d'obtenir la liste des extensions Nova."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "La vérification de la stratégie a échoué."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Impossible de récupérer les groupes de sécurité."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Chargement..."
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "Pas de données disponibles."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "Une erreur s'est produite. Veuillez réessayer ultérieurement."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "Problème de communication avec le serveur, veuillez réessayer."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Le fichier n'a pu être lu"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Le mot de passe n'a pu être déchiffré"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Aucun rôle"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Rôles"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Danger :"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Avertissement :"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Notification :"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Succès :"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Erreur :"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Traitement en cours..."
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "Erreur lors de la soumission du formulaire. Veuillez réessayer. "
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "Aucun"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Supprimer"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUT"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Interfaces"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Supprimer l'Interface"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Ouvrir une Console"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "Voir les détails"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Supprimer un Routeur"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "Voir les Détails du Routeur"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Ajouter une interface"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Terminer l'Instance"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "Voir les Détails de l'Instance"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "Aucun élément à afficher."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "Une erreur s'est produite durant la mise à jour."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "Vous avez sélectionné %s."
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Confirmez %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Merci de confirmer votre sélection."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Vous n'êtes pas autorisé à effectuer cette opération."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Les mots de passe ne correspondent pas."

View File

@ -1,507 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Akihiro Motoki <amotoki@gmail.com>, 2014-2015
# myamamot <myamamot@redhat.com>, 2014-2015
# ykatabam <ykatabam@redhat.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-06 23:21+0000\n"
"Last-Translator: myamamot <myamamot@redhat.com>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/horizon/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: base.py:475
msgid "Other"
msgstr "その他"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "ナビゲーション項目"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "表示する %s を選択してください。"
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "パスワードを受け付けられません"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "続行するには、ログインしてください。"
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "%s へのアクセスが許可されていません。"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "名前が \"%(name)s\" の %(resource)s がすでに存在します。"
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "権限がありません: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "認証されていません。もう一度ログインしてください。"
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "不正な形式の IP アドレス"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "無効な IP アドレスのバージョン"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "無効なサブネットマスク"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "送信"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "取り消し"
#: middleware.py:103
msgid "Session timed out."
msgstr "セッションがタイムアウトしました。"
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "フィルター"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "この操作は取り消せません。"
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(data_type)sの%(action)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(data_type)sの%(action)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "%(action)s は許可されていません: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "%(action)s を実行できません: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "削除"
#: tables/actions.py:917
msgid "Deleted"
msgstr "削除"
#: tables/actions.py:948
msgid "Update"
msgstr "更新"
#: tables/actions.py:949
msgid "Updated"
msgstr "更新日時"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "%(obj)s に 属性 %(attr)s が存在しません。"
#: tables/base.py:990
msgid "No items to display."
msgstr "表示する項目がありません"
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "アクション"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "ID \"%s\" に一致するものがありません。"
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "このアクションを実行する前に、対象を選択してください。"
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "%(username)s としてログイン中"
#: templates/_header.html:7
msgid "Help"
msgstr "ヘルプ"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "ログアウト"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n 使用する認証メソッドが不明な場合は、管理者に問い合わせてください。\n "
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "ログイン"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "リソースにアクセスする権限がありません:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "他のユーザーとしてログインするか、<a href=\"%(home_url)s\">ホームページ</a>に戻ってください。"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "ログイン"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "接続"
#: templates/auth/login.html:4
msgid "Login"
msgstr "ログイン"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "情報: "
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "警告: "
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "成功: "
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "エラー: "
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "概要"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "%(counter)s件表示"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;前へ"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "次へ&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "その他のアクション"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "行の追加"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "利用可能リソース概要"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "インスタンス"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span>%(used)s</span> / <span>%(available)s</span> 使用中"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "仮想 CPU"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "メモリー"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "Floating IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(used)s </span> / <span> %(available)s </span> 割り当て済み"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "セキュリティーグループ"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "ボリューム"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "ボリューム容量"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "保存"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "%(nav_items)s件表示"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "%(content_items)s件表示"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "使用状況の概要"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "使用状況を照会する期間を選択してください:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n%(start)s <label>から</label>"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n%(end)s <label>まで</label>"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "日付は YYYY-mm-dd 形式にする必要があります。"
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "稼働中のインスタンス:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "使用中のメモリー:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "指定期間中の仮想 CPU 時間:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "指定期間中の GB 時間:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "指定期間中のメモリー時間"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "戻る"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "次へ"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "制限なし"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "利用可能"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)dB"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 バイト"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "子犬を売る"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "子犬を売りました"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Fake"
#: utils/filters.py:49
msgid "Never"
msgstr "なし"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "有効なポート番号ではありません"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "有効な IP プロトコル番号ではありません"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "ポート範囲で使用できるコロンは 1 つだけです。"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "ポート番号は整数でなければなりません"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "文字列に含めることができるのは ASCII 印字可能文字のみです。"
#: workflows/base.py:71
msgid "Processing..."
msgstr "処理中..."
#: workflows/base.py:475
msgid "All available"
msgstr "利用可能な全項目"
#: workflows/base.py:476
msgid "Members"
msgstr "メンバー"
#: workflows/base.py:477
msgid "None available."
msgstr "利用可能な項目がありません。"
#: workflows/base.py:478
msgid "No members."
msgstr "メンバーがいません。"
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s が正常に完了しました。"
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s が完了しませんでした。"

View File

@ -1,621 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Akihiro Motoki <amotoki@gmail.com>, 2014-2015
# myamamot <myamamot@redhat.com>, 2015
# Tom Fifield <tom@openstack.org>, 2015
# ykatabam <ykatabam@redhat.com>, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:06+0000\n"
"Last-Translator: ykatabam <ykatabam@redhat.com>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/horizon/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "操作を実行できません。この行の内容にエラーがあるか、情報が見つかりません。"
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "詳細情報"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "左の列から右の列にアイテムを移動して、リソースのメタデータを指定できます。左の列には、Glance のメタデータカタログに登録されているメタデータの定義が表示されています。任意のキーのメタデータを追加するには、\"Other\" オプションを使ってください。"
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "最小値"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "最大値"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "最小長"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "最大長"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "パターンが一致しません。"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "整数を指定する必要があります。"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "十進数を指定する必要があります。"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "必須"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "重複するキーは使用できません"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "フィルター"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "利用可能なメタデータ"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "選択済みのメタデータ"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "カスタム"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "利用可能なメタデータはありません"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "選択済みのメタデータはありません"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "送信"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "取り消し"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "割り当て済み"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "利用可能"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "1 つ選択してください。"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "以下の利用可能なアイテムから 1 つ選択してください。"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "利用できるアイテムがありません。"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "割り当て済みのアイテムを表示するには展開してください。"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "利用可能なアイテムを表示するには展開してください。"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "クリックして表示/非表示を切り替えてください。"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "順番を並べ替えるには、アイテムをドラッグ&ドロップしてください。"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "クリックすると詳しい情報が表示されます。"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "%(total)s 中 %(found)s 見つかりました。"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "行を展開してエラーを表示するには、ここをクリックしてください。"
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "戻る"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "次へ"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "完了"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "接続中"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "オープン"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "切断中"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "切断済み"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "ステータス: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "はい"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "いいえ"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s バイト"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "%s件表示"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "ボリューム情報を取得できません。"
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "ボリュームスナップショットの一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "ユーザーの設定を取得できません。"
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "管理者の設定を取得できません。"
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "設定を取得できません。"
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "設定 %(setting)s が有効になっていません。"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "イメージ情報を取得できません。"
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "イメージ一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "名前空間を取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "ユーザー一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "ユーザーを作成できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "ユーザーを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "現在のユーザーセッションを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "ユーザーを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "ユーザーを編集できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "ユーザーを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "ロールを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "ロールを作成できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "ロールを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "ロールを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "ロールを編集できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "ロールを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "ドメイン一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "ドメインを作成できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "ドメインを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "ドメインを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "ドメインを編集できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "ドメインを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "プロジェクト一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "プロジェクトを作成できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "プロジェクトを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "プロジェクトを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "プロジェクトを編集できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "プロジェクトを削除できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "ロールを許可できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "サービスカタログを取得できません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "サービスタイプ %(desiredType)s が有効になっていません。"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "keystone からサービスカタログを取得できません。"
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "ネットワーク一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "ネットワークを作成できません。"
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "サブネットを取得できません。"
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "サブネットを作成できません。"
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "ポートを取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "キーペアの一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "キーペアをインポートできません。"
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "キーペアを取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "アベイラビリティーゾーンを取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "上限を取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "サーバーを作成できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "サーバーを取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "拡張機能を取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "フレーバーの一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "フレーバーを取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "フレーバーの追加スペックを取得できません。"
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "拡張機能 %(extension)s が有効ではありません。"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "nova の拡張機能一覧を取得できません。"
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "ポリシーチェックに失敗しました。"
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "セキュリティーグループの一覧を取得できません。"
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "読み込み中"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "データがありません。"
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "エラーが発生しました。後からもう一度お試しください。"
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "サーバーとの通信中に問題がありました。再度お試しください。"
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "ファイルを読み取ることができませんでした。"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "パスワードの復号化できませんでした。"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "ロールがありません"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "ロール"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "危険:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "警告: "
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "注意:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "成功: "
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "エラー: "
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "反映中"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "フォームの送信中にエラーが発生しました。再度お試しください。"
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "なし"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "削除"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "ステータス"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "インターフェース"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "インタフェースの削除"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "コンソールを開く"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "詳細の表示"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "ルーターの削除"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "ルーターの詳細の表示"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "インターフェースの追加"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "インスタンスの終了"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "インスタンスの詳細の表示"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "表示する項目がありません"
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "更新中にエラーが発生しました。"
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "%s を選択しました。"
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "%sの確認"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "選択内容を確認してください。"
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "この操作を行う権限がありません。"
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "パスワードが一致しません。"

View File

@ -1,508 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ian Y. Choi <ianyrchoi@gmail.com>, 2015
# Ian Y. Choi <ianyrchoi@gmail.com>, 2015
# jaekwon.park <jaekwon.park@rockplace.co.kr>, 2014
# Sungjin Kang <potopro@gmail.com>, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-06 17:01+0000\n"
"Last-Translator: Sungjin Kang <potopro@gmail.com>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/horizon/language/ko_KR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ko_KR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: base.py:475
msgid "Other"
msgstr "기타"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "네비게이션 항목"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "브라우져에서 %s를 선택하십시오."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "허용되지 않는 비밀번호입니다."
#: decorators.py:53
msgid "Please log in to continue."
msgstr "계속 진행하려면 로그인하십시오."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "%s에 접근 권한이 없습니다. "
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "이름 \"%(name)s\"과 %(resource)s이 이미 존재합니다."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "권한이 없습니다: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "권한이 없습니다. 다시 로그인 해주십시오."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "IP 주소 형식이 잘못 되었습니다."
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "IP 주소 버전이 잘못되었습니다."
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "서브넷 마스크가 잘못되었습니다."
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "제출"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "취소"
#: middleware.py:103
msgid "Session timed out."
msgstr "세션 타임 아웃."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "필터"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "이 작업은 취소할 수 없습니다."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(data_type)s %(action)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(data_type)s %(action)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr " %(action)s 이(가) 허용되지 않습니다: %(objs)s "
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "%(action)s을(를) 할 수 없습니다.: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "삭제"
#: tables/actions.py:917
msgid "Deleted"
msgstr "삭제 완료"
#: tables/actions.py:948
msgid "Update"
msgstr "업데이트"
#: tables/actions.py:949
msgid "Updated"
msgstr "업데이트 완료"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "%(obj)s 에 %(attr)s 속성이 없습니다."
#: tables/base.py:990
msgid "No items to display."
msgstr "표시할 항목이 없습니다."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "작업"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "ID \"%s\" 에 일치되는 항목이 없습니다."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "해당 작업을 실행하기 전에 열(row)을 선택하십시오."
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "로그인됨: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "도움말"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "로그아웃"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n당신이 인증 방법을 모르는경우, 관리자에게 문의하십시오."
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "로그인"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "당신은 리소스에 접근할 권한이 없습니다.:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "다른 사용자로 로그인하거나 <a href=\"%(home_url)s\">홈페이지</a>로 되돌아가기"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "등록"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "연결"
#: templates/auth/login.html:4
msgid "Login"
msgstr "로그인"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "정보:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "경고:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "완료:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "오류:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "요약"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "%(counter)s 항목 표시"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;이전"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "다음&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "기타 작업"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "열 추가"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "간략한 요약"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "인스턴스"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(available)s </span> 중에서 <span> %(used)s </span> 사용"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPUs"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "유동 IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(available)s </span> 중에서 <span> %(used)s </span> 할당"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "보안 그룹"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "볼륨"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "볼륨 스토리지"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "저장"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "%(nav_items)s 항목 표시"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "%(content_items)s 항목 표시"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "사용량 요약"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "사용량을 조회할 기간을 선택하세요:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n<label>시작:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n<label>끝:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "날짜는 YYYY-mm-dd 형식이어야 합니다."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "동작 중인 인스턴스:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "사용 중인 RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "이 기간의 VCPU 사용 시간:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "이 기간의 GB-Hours 사용 시간:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "이 기간의 RAM 사용 시간:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "뒤로"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "다음"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "제한 없음"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "사용 가능"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d 바이트"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Bytes"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "강아지 판매"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "강아지 판매함"
#: test/tests/views.py:59
msgid "Fake"
msgstr "페이크"
#: utils/filters.py:49
msgid "Never"
msgstr "없음"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "유효하지 않은 포트 번호"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "유효하지 않은 IP 프로토콜 번호"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "포트 범위에서 콜론은 하나만 사용할 수 있습니다."
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "포트 번호는 정수이어야 합니다."
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "문자열은 ASCII 인쇄 문자를 포함할 수 있습니다."
#: workflows/base.py:71
msgid "Processing..."
msgstr "작업 중..."
#: workflows/base.py:475
msgid "All available"
msgstr "모두 사용가능"
#: workflows/base.py:476
msgid "Members"
msgstr "구성원"
#: workflows/base.py:477
msgid "None available."
msgstr "사용할 수 있는 것이 없음."
#: workflows/base.py:478
msgid "No members."
msgstr "구성원이 없습니다."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s가 성공적으로 완료되었습니다."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s가 완료되지 않았습니다."

View File

@ -1,621 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ian Y. Choi <ianyrchoi@gmail.com>, 2015
# jaekwon.park <jaekwon.park@rockplace.co.kr>, 2014
# jaekwon.park <jaekwon.park@rockplace.co.kr>, 2014
# Sungjin Kang <potopro@gmail.com>, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-11 11:47-0500\n"
"PO-Revision-Date: 2015-04-12 02:21+0000\n"
"Last-Translator: Sungjin Kang <potopro@gmail.com>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/horizon/language/ko_KR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ko_KR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "작업을 진행할 수 없습니다. 이 행의 내용에 오류가 있거나 정보가 누락되어 있습니다."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "상세 정보"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "왼쪽 열에서 오른쪽 열로 항목을 이동하여 리소스 메타데이터를 지정할 수 있습니다. 왼쪽 열에서 Glance 메타데이터 카탈로그에서 메타데이터를 정의할 수 있습니다. \"Other\" 옵션을 사용하여 선택한 키를 메타데이터에 추가할 수 있습니다."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "최소"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "최대"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "최소 길이"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "최대 길이"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "패턴 불일치"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "정수 필요"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "실수 필요"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "필요"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "중복 키를 허용하지 않습니다."
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "필터"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "사용 가능한 메타데이터"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "기존 메타데이터"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "사용자 지정"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "사용 가능한 메타데이터가 없습니다."
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "기존 메타데이터가 없습니다."
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "제출"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "취소"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "할당됨"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "사용 가능"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "하나 선택"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "아래의 사용 가능한 항목에서 항목을 선택"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "사용 가능한 항목 없음"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "할당된 항목을 볼 수 있도록 확장"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "사용 가능한 항목을 볼 수 있도록 확장"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "클릭하여 보기 또는 감추기"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "다시 주문할 아이템은 드래그 앤 드롭으로 가져옵니다."
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "클릭하여 세부 사항 보기"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "%(total)s 의 %(found)s 찾기"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "클릭하여 열을 확장하고 에러를 확인할 수 있습니다."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "뒤로"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "다음"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "완료"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "연결중"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "열림"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "닫는중"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "닫음"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "상태: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "예"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "아니오"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s 바이트"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "%s 항목 표시"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "볼륨을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "볼륨 스냅샷을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "사용자 구성을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "관리자 구성을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "설정을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "설정을 활성하지 못했습니다: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "이미지를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "이미지를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "네임스페이스를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "사용자를 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "사용자를 만들지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "사용자를 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "현재 사용자 섹션을 찾을 수 없습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "사용자를 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "사용자를 수정하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "사용자를 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Role을 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Role을 만들지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Role을 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Role을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Role을 수정하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Role을 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "도메인을 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "도메인을 만들지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "도메인을 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "도메인을 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "도메인을 수정하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "도메인을 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "프로젝트를 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "프로젝트를 만들지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "프로젝트를 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "프로젝트를 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "프로젝트를 수정하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "프로젝트를 삭제하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Role을 부여하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "서비스 카탈로그를 가져올 수 없습니다."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "서비스 타입을 활성화하지 못 했습니다: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Keystone으로부터 서비스 목록을 가져올 수 없습니다."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "네트워크를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "네트워크를 생성하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "서브넷을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "서브넷을 생성하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "포트를 검색하지 못했습니다"
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Keypair를 찾을 수 없습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "키페어를 가져올 수 없습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Keypair를 생성하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "가용성 존에 대한 정보를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "제한을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "서버를 생성하지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "서버를 찾지 못했습니다"
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "확장을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Flavor를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Flavor를 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Flavor 확장 스팩을 찾지 못했습니다."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "확장을 활성화하지 못 했습니다: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Nova 확장 목록을 가져올 수 없습니다."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "정책 확인 실패함."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "시큐리티 그룹을 찾지 못했습니다."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "불러오는 중"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "데이터가 없습니다."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "오류가 발생했습니다. 나중에 다시 시도하십시오."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "서버와의 통신에 문제가 발생하였으니, 다시 시도하세요."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "파일을 읽을 수 없습니다"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "암호를 해독할 수 없습니다."
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Role 없음"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Roles"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "위험:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "경고:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "주의:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "완료:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "오류:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "작동 중"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "양식을 제출하는 동안 오류가 발생하였습니다. 다시 시도하세요."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "None"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "삭제"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUS"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "인터페이스"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "인터페이스 삭제"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "콘솔 열기"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "세부 정보 보기"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "라우터 삭제"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "라우터 정보 자세히 보기"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "인터페이스 추가"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "인스턴스 종료"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "인스턴스 정보 자세히 보기"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "표시할 항목이 없습니다."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "업데이트 도중 오류가 발생하였습니다."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "%s를 선택하였습니다. "
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "%s를 확인하세요."
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "선택 사항을 확인하십시오."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "이 작업에 대한 권한이 없습니다."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "비밀번호가 일치하지 않습니다."

View File

@ -1,517 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Łukasz Jernaś <deejay1@srem.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-07 01:16-0500\n"
"PO-Revision-Date: 2015-04-21 12:54+0000\n"
"Last-Translator: Łukasz Jernaś <deejay1@srem.org>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/horizon/language/pl_PL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl_PL\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: base.py:475
msgid "Other"
msgstr "Inne"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Pozycja nawigacyjna"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Wybierz %s by przeglądać."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Hasło nie zostało zaakceptowane"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Należy się zalogować, aby można było kontynuować."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "Brak uprawnień dostępu do %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "%(resource)s o nazwie \"%(name)s\" już istnieje."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "Nieupoważniono: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Brak uprawnień. Proszę spróbować się wylogować i zalogować ponownie."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Błędny format adresu IP"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Błędna wersja adresu IP"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Błędna maska podsieci"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Wyślij"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Anuluj"
#: middleware.py:103
msgid "Session timed out."
msgstr "Sesja wygasła."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filtr"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "Tej czynności nie można cofnąć."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "Brak uprawnień do %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Nie można %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Usuń"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Usunięto"
#: tables/actions.py:948
msgid "Update"
msgstr "Aktualizuj"
#: tables/actions.py:949
msgid "Updated"
msgstr "Zaktualizowany"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "Atrybut %(attr)s nie istnieje dla %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "Brak pozycji do wyświetlenia."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Czynności"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "Nie znaleziono wyników dla identyfikatora „%s”."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Należy wybrać wiersz przed wykonaniem tej czynności."
#: tables/base.py:1570
msgid "N/A"
msgstr "n.d."
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Zalogowano jako: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Pomoc"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Wyloguj"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\nJeśli nie wiadomo, którego sposobu uwierzytelniania użyć, należy skontaktować się z administratorem."
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Zaloguj"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "Brak uprawnień do zasobu:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Należy zalogować się jako inny użytkownik lub wrócić do <a href=\"%(home_url)s\"> strony domowej</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Wpisz się"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Połącz"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Login"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Informacja:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Ostrzeżenie:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Powodzenie:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Błąd:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Podsumowanie"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Wyświetlanie %(counter)s pozycji"
msgstr[1] "Wyświetlanie %(counter)s pozycji"
msgstr[2] "Wyświetlanie %(counter)s pozycji"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Poprzednie"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Następne&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "Pozostałe akcje"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Dodaj wiersz"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Podsumowanie limitów"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instancje"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Wykorzystano <span> %(used)s </span> z <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPU"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "Pływające adresy IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Przydzielono <span> %(used)s </span> z <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Grupy zabezpieczeń"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Wolumeny"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Przechowywanie danych"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Zapisz"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Wyświetlanie %(nav_items)s pozycję"
msgstr[1] "Wyświetlanie %(nav_items)s pozycji"
msgstr[2] "Wyświetlanie %(nav_items)s pozycji"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Wyświetlanie %(content_items)s pozycji"
msgstr[1] "Wyświetlanie %(content_items)s pozycji"
msgstr[2] "Wyświetlanie %(content_items)s pozycji"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Podsumowanie wykorzystania"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Wybierz okres, za który należy wyświetlić wykorzystanie:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n<label>Od:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>Do:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "Data powinna być podana w formacie YYYY-mm-dd."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Aktywne instancje:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "Aktywna pamięć RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "VCPU-godziny w tym okresie:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "GB-godziny w tym okresie:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "RAM-godziny w tym okresie:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Wstecz"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Następny"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "Bez ograniczeń"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Dostępne"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d bajt"
msgstr[1] "%(size)d bajty"
msgstr[2] "%(size)d bajtów"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 bajtów"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "Sprzedaj pieska"
msgstr[1] "Sprzedaj pieski"
msgstr[2] "Sprzedaj pieski"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "Sprzedano pieska"
msgstr[1] "Sprzedano pieski"
msgstr[2] "Sprzedano pieski"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Fałszywe"
#: utils/filters.py:49
msgid "Never"
msgstr "Nigdy"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Błędny numer portu"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Błędny numer protokołu IP"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "Tylko jeden dwukropek jest dozwolony w zakresie portów"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Numer portu musi być liczbą całkowitą"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "Ciąg może zawierać wyłącznie drukowalne znaki ASCII."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Przetwarzanie…"
#: workflows/base.py:475
msgid "All available"
msgstr "Całość dostępna"
#: workflows/base.py:476
msgid "Members"
msgstr "Członkowie"
#: workflows/base.py:477
msgid "None available."
msgstr "Całość wykorzystana"
#: workflows/base.py:478
msgid "No members."
msgstr "Brak członków."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s zakończona pomyślnie."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s nie została zakończona."

View File

@ -1,620 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Łukasz Jernaś <deejay1@srem.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:06+0000\n"
"Last-Translator: Łukasz Jernaś <deejay1@srem.org>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/horizon/language/pl_PL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl_PL\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "Nie można wykonać czynności. Zawartość tego wiersza zawiera błędy lub brakujące dane."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Szczegółowe informacje"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "Można podać metadane zasobów przesuwając pozycje z lewej kolumny do prawej. W lewej kolumnie znajdują się definicje metadanych z Katalogu Metadanych Glance. Można podać metadane z własnym kluczem, po wybraniu opcji „Inne”."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Min."
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Maks."
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Min. długość"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Maks. długość"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Szablon się nie zgadza"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Wymagana liczba całkowita"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Wymagana liczba dziesiętna"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Wymagane"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Ponowne użycie nazwy klucza jest niedozwolone."
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filtr"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Dostępne metadane"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Istniejące metadane"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Własne"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "Metadane niedostępne"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "Brak metadanych"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Wyślij"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Anuluj"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Przydzielono"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Dostępne"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Wybierz jedno"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Należy wybrać pozycję z listy dostępnych pozycji poniżej"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "Brak dostępnych pozycji"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Rozszerz, aby zobaczyć przydzielone pozycje"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Rozszerz, aby zobaczyć dostepne pozycje"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Kliknij by pokazać lub ukryć"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Zmień kolejność pozycji poprzez przesuwanie i upuszczanie"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Kliknij, aby wyświetlić szczegóły"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "Znaleziono %(found)s z %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Kliknij tutaj, aby rozszerzyć wiersz i wyświetlić błędy."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Wstecz"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Następny"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Zakończ"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Łączenie"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Otwórz"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Zamykanie"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Zamknięto"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Stan: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Tak"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "Nie"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s bajtów"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Wyświetlanie %s pozycji"
msgstr[1] "Wyświetlanie %s pozycji"
msgstr[2] "Wyświetlanie %s pozycji"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Nie można pobrać wolumenów."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Nie można pobrać migawek wolumenów."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Nie można pobrać ustawień użytkownika."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Nie można pobrać ustawień administratora."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Nie można pobrać ustawień."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Ustawienie jest wyłączone: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Nie można pobrać obrazu."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Nie można pobrać obrazów"
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Nie można pobrać przestrzeni nazw."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Nie można pobrać użytkowników"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Nie można utworzyć użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Nie mozna usunąć użytkowników."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Nie można pobrać bieżącej sesji użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Nie można pobrać użytkownika"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Nie można edytować użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Nie można usunąć użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Nie można pobrać roli"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Nie można utworzyć roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Nie mozna usunąć ról."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Nie można pobrać roli"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Nie można edytować roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Nie można usunąć roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Nie można pobrać domen"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Nie można utworzyć domeny."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Nie można usunąć domen."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Nie można pobrać domeny"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Nie można edytować domeny."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Nie można usunąć domeny."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Nie można pobrać projektów"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Nie można utworzyć projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Nie można usunąć projektów."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Nie można pobrać projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Nie można edytować projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Nie można usunąć projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Nie można nadać roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Nie można pobrać katalogu usług."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Typ usługi nie jest włączony: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Nie można pobrać katalogu usług z keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Nie można pobrać sieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Nie można utworzyć sieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Nie można pobrać podsieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Nie można utworzyć podsieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Nie można pobrać portów."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Nie można pobrać par kluczy."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Nie można zaimportować pary kluczy."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Nie można utworzyć pary kluczy."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Nie można pobrać stref dostępności."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Nie można pobrać ograniczeń."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Nie można utworzyć serwera."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Nie można pobrać serwera."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Nie można pobrać rozszerzeń."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Nie można pobrać odmian."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Nie można pobrać odmiany."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Nie można pobrać dodatkowych danych odmiany."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Rozszerzenie nie jest włączone: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Nie można pobrać listy rozszerzeń novy."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Sprawdzenie polityki się nie powiodło."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Nie można pobrać grup zabezpieczeń."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Wczytywanie"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "Brak dostępnych danych."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "Wystąpił błąd. Proszę spróbować później."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "Wystąpił problem w komunikacji z serwerem, proszę spróbować ponownie."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Nie można odczytać pliku"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Nie można odszyfrować hasła"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Brak ról"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Role"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Zagrożenie:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Ostrzeżenie:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Powiadomienie:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Powodzenie:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Błąd:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Praca"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "Wystąpił błąd podczas wysyłania formularza. Proszę spróbować ponownie."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "Brak"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Usuń"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUS"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Interfejsy"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Usuń interfejs"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Otwórz konsolę"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "Wyświetl szczegóły"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Usuń router"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "Wyświetl szczegóły routera"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Dodaj interfejs"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Zniszcz instancję"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "Wyświetl szczegóły instancji"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "Brak pozycji do wyświetlenia."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "Wystąpił błąd podczas aktualizacji."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "Wybrano %s."
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Potwierdź %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Należy potwierdzić wybór."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Nie upoważniono do przeprowadzenie tej czynności."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Hasła nie pasują"

View File

@ -1,514 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Fernando F. Rodrigues <rodrigues_fernando@hotmail.com>, 2015
# Gabriel Wainer, 2015
# Remulo Carvalho <remulo@gmail.com>, 2015
# Rodrigo Felix de Almeida <rodrigofelixdealmeida@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-07 15:52+0000\n"
"Last-Translator: Remulo Carvalho <remulo@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/horizon/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: base.py:475
msgid "Other"
msgstr "Outro"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Item de Navegação"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Selecione um %s para navegar."
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Senha não foi aceita"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Por favor faça login para continuar."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "Você não está autorizado a acessar %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "Um %(resource)s com o nome \"%(name)s\" já existe."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "Não autorizado: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Não autorizado. Por favor tente efetuar login novamente."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Formato incorreto para o endereço IP"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Versão inválida para o endereço IP"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Máscara de sub-rede inválida"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Enviar"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Cancelar"
#: middleware.py:103
msgid "Session timed out."
msgstr "Tempo limite da sessão esgotou."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Filtro"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "Esta ação não pode ser desfeita."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "Você não possui permissão para %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Não foi possível %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Excluir"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Excluído"
#: tables/actions.py:948
msgid "Update"
msgstr "Atualizar"
#: tables/actions.py:949
msgid "Updated"
msgstr "Atualizado"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "O atributo %(attr)s não existe em %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "Sem itens para exibir."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Ações"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "Não foi encontrada correspondência para o ID \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Por favor selecione uma linha antes de realizar esta ação."
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Logado como: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Ajuda"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Sair"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\nSe você não tem certeza do método de autenticação a ser utilizado, entre em contato com o seu administrador."
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Entrar"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "Você não tem permissão para acessar o recurso:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Faça login com um usuário diferente ou volte para a <a href=\"%(home_url)s\"> página inicial</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Entrar"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Conectado"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Logar"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Informação:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Alerta:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Sucesso:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Erro:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Resumo"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Exibindo %(counter)s item"
msgstr[1] "Exibindo %(counter)s itens"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Prev"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Next&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "Mais Ações"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Adicionar uma linha"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Resumo de Limites"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Instâncias"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Utilizado <span> %(used)s </span> de <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "vCPUs"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "IPs Flutuantes"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Alocado <span> %(used)s </span> de <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Grupos de Segurança"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Volumes"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Armazenamento de volume"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Salvar"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Exibindo %(nav_items)s item"
msgstr[1] "Exibindo %(nav_items)s itens"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Exibindo %(content_items)s item"
msgstr[1] "Exibindo %(content_items)s itens"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Resumo de Utilização"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Selecione um período de tempo para consultar seu uso:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>De:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>Para:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "A data deve estar no formato YYYY-mm-dd."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Instâncias ativas:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "RAM ativa:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "VCPU-Horas desse Período:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "GB-Horas desse Período:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "Quantidade de RAM-Horas deste período:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Voltar"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Próximo"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "Sem Limite"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Disponível"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d Byte"
msgstr[1] "%(size)d Bytes"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 Bytes"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "Vender Puppy"
msgstr[1] "Vender Puppies"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "Puppy Vendido"
msgstr[1] "Puppies Vendidos"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Falso"
#: utils/filters.py:49
msgid "Never"
msgstr "Nunca"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Não é um número de porta válido"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Não é um número de protocolo IP válido"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "Uma pontução de dois pontos permitida no intervalo de portas"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Número de porta deve ser inteiro"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "A string somente deve conter caracteres ASCII imprimíveis."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Processando..."
#: workflows/base.py:475
msgid "All available"
msgstr "Tudo disponível"
#: workflows/base.py:476
msgid "Members"
msgstr "Membros"
#: workflows/base.py:477
msgid "None available."
msgstr "Nenhum disponível."
#: workflows/base.py:478
msgid "No members."
msgstr "Sem membros."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s concluído com sucesso."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s não completou."

View File

@ -1,622 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Fernando Pimenta <fernando.c.pimenta@gmail.com>, 2015
# Gabriel Wainer, 2015
# maurosr <maurosmrodrigues@gmail.com>, 2015
# Rodrigo Felix de Almeida <rodrigofelixdealmeida@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 16:36-0500\n"
"PO-Revision-Date: 2015-04-14 01:40+0000\n"
"Last-Translator: Fernando Pimenta <fernando.c.pimenta@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/horizon/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "A ação não pôde ser executada. O conteúdo desta linha possui erros ou informações indisponíveis"
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Informações delhadas"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "Você pode especificar metadados de recurso movendo itens da coluna da esquerda para a coluna da direita. Nas colunas da esquerda existem definições de metadados do catálogo de metadados do Glance. Utilize a opção \"Outros\" para adicionar metadados com a chave de sua escolha."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Mín. "
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Máx."
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Tamanho mínimo"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Tamanho máximo"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Incompatibilidade de padrão"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Inteiro requerido"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Decimal requerido"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Requerido"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Chaves duplicadas não são permitidas"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Filtro"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Metadados disponível"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Metadados existente"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Customizado"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "Metadados não disponível"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "Metadados não existente"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Enviar"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Cancelar"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Alocado"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Disponível"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Selecione"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Selecione um item dentre os disponíveis abaixo"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "Itens indisponíveis"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Expanda para ver os itens alocados"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Expanda para ver os itens disponíveis"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Clique para exibir ou esconder"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "reordene os itens clicando em um deles e arrastando-o"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Clique para ver mais detalhes."
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "Encontrado %(found)s de %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Clique aqui para expandir a linha e ver os erros."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Voltar"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Próximo"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Encerrar"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Conectando"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Abrir"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Encerramento"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Encerrado"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Status: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Sim"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "Não"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s bytes"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Exibindo %s item"
msgstr[1] "Exibindo %s itens"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Não foi possível obter a lista de volumes."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Não é possível recuperar snapshots de volume."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Não foi possível recuperar as configurações de usuário"
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Não foi possível recuperar as configurações de administrador"
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Não é possível recuperar as configurações."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Configuração não está habilitada: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Não foi possível recuperar a imagem."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Não foi possível obter as imagems"
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Não é possível recuperar namespaces."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Não foi possível obter os usuários"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Não foi possível criar o usuário."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Não foi possível excluir os usuários."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Não é possível recuperar a sessão atual do usuário."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Não foi possível obter o usuário"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Não foi possível editar o usuário."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Não foi possível excluir o usuário."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Não foi possível obter o papel"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Não foi possível criar o papel."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Não foi possível excluir os papéis."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Não foi possível obter o papel"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Não foi possível editar o papel."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Não foi possível excluir o papel."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Não foi possível obter os domínios"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Não foi possível criar o domínio."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Não foi possível excluir os domínios."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Não foi possível obter o domínio"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Não foi possível editar o domínio."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Não foi possível excluir o domínio."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Não foi possível obter os projetos"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Não foi possível criar o projeto."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Não foi possível excluir os projetos."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Não foi possível obter o projeto"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Não foi possível editar o projeto."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Não foi possível excluir o projeto."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Não foi possível permitir o papel."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Não é possível obter o catálogo de serviços."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Tipo de serviço não está habilitado: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Não é possível obter o catálogo de serviços a partir do keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Não é possível recuperar redes."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Não foi possível criar a rede"
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Não é possível recuperar a subredes."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Não foi possível criar sub-rede"
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Não foi possível obter lista de portas."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Não é possível recuperar pares de chaves."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Não é possível importar o par de chaves."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Não foi possível criar o par de chaves."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Não é possível recuperar todas zonas de disponibilidade."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Não foi possível obter informações de limite."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Não foi possível criar a instância"
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Não é possível recuperar servidor."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Não é possível recuperar extensões."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Não foi possível recuperar flavors."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Não é possível recuperar flavor."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Não é possível recuperar especificações extras do flavor."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Extensão não está habilitada: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Não é possível obter lista de extensão do nova."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Verificação de política falhou."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Não é possível recuperar grupos de segurança"
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Carregando"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "Não há dados disponíveis."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "Um erro ocorreu. Por favor tente novamente mais tarde."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "Houve um problema ao comunicar-se com o servidor, por favor tente novamente."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Não foi possivel ler o arquivo"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Não foi possível descriptografar a senha"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Sem papéis"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Papéis"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Perigo:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Alerta:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Notificação:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Sucesso:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Erro:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Trabalhando"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "Houve um erro ao enviar o formulário. Por favor tente novamente."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "Nenhum"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Excluir"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "STATUS"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Interfaces"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Excluir Interface"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Abrir Console"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "Ver Detalhes"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Excluir Roteador"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "Ver Detalhes do Roteador"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Adicionar Interface"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Terminar Instância"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "Ver Detalhes da Instância"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "Sem itens para exibir."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "Um erro ocorreu ao atualizar."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "Você selecionou %s."
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Confirma %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Por favor confirme a sua seleção."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Não autorizado para realizar esta operação."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "As senhas não conferem."

View File

@ -1,518 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ilya Alekseyev <ilyaalekseyev@acm.org>, 2015
# Nikita Burtsev, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 16:36-0500\n"
"PO-Revision-Date: 2015-04-13 12:42+0000\n"
"Last-Translator: Ilya Alekseyev <ilyaalekseyev@acm.org>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/horizon/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: base.py:475
msgid "Other"
msgstr "Другое"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "Элемент навигации"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "Выберите %s для просмотра"
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "Пароль не принят"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "Войдите в систему для продолжения."
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "Нет права доступа к %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "%(resource)s с именем\"%(name)s\" уже существует."
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "Не авторизован: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "Вы не авторизованы. Попробуйте войти в систему еще раз."
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "Неправильный формат IP-адреса"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "Неправильная версия IP-адреса"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "Неправильная маска подсети"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "Отправить"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "Отмена"
#: middleware.py:103
msgid "Session timed out."
msgstr "Время сеанса истекло."
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "Фильтр"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "Это действие не может быть отменено."
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "Вам не разрешено выполнение: %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "Невозможно выполнить %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "Удалить"
#: tables/actions.py:917
msgid "Deleted"
msgstr "Удалено"
#: tables/actions.py:948
msgid "Update"
msgstr "Обновить"
#: tables/actions.py:949
msgid "Updated"
msgstr "Обновлено"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "Атрибут %(attr)s не существует для %(obj)s."
#: tables/base.py:990
msgid "No items to display."
msgstr "Нет элементов для отображения."
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "Действия"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "Нет совпадений для id \"%s\"."
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "Выберите строку перед выполнением этого действия."
#: tables/base.py:1570
msgid "N/A"
msgstr "Н/Д"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "Пользователь: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "Помощь"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "Выход"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n Если вы не уверены какой метод аутентификации выбрать, свяжитесь с вашим системным администратором.\n "
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "Войти"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "Вы не имеете права на доступ к ресурсу:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "Войдите под другим пользователем или вернитесь на<a href=\"%(home_url)s\"> домашнюю страницу</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "Вход"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "Подключиться"
#: templates/auth/login.html:4
msgid "Login"
msgstr "Имя пользователя"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "Информация:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "Внимание:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "Успешно:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "Ошибка:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "Итого"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "Показан %(counter)s элемент"
msgstr[1] "Показано %(counter)s элементов"
msgstr[2] "Показано %(counter)s элементов"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;Предыдущее"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "Следующее&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "Еще действия"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "Добавить строку"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "Сводка лимитов"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "Машины"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Использовано <span> %(used)s </span> из <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "VCPU"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "Назначаемые IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "Выделено <span> %(used)s </span> из <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "Группы безопасности"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "Диски"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "Хранилище"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "Сохранить"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "Показан %(nav_items)s элемент"
msgstr[1] "Показано %(nav_items)s элементов"
msgstr[2] "Показано %(nav_items)s элементов"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "Показан %(content_items)s элемент"
msgstr[1] "Показано %(content_items)s элементов"
msgstr[2] "Показано %(content_items)s элементов"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "Сводка использования"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "Выберите временной интервал для запроса использования:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>От:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>До:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "Дата должна иметь формат YYYY-mm-dd."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "Активные машины:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "Используемая RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "vCPU-часов за период:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "ГБ-часов за период:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "RAM-часов за период:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "Назад"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "Следующий"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "Без ограничений"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "Доступно"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d байт"
msgstr[1] "%(size)d байт"
msgstr[2] "%(size)d байт"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s КБ"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s МБ"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s ГБ"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s ТБ"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s ПБ"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 байт"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] ""
msgstr[1] ""
msgstr[2] "Sell Puppies"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] ""
msgstr[1] ""
msgstr[2] "Sold Puppies"
#: test/tests/views.py:59
msgid "Fake"
msgstr "Fake"
#: utils/filters.py:49
msgid "Never"
msgstr "Никогда"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "Недопустимый номер порта"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "Недопустимый номер IP-протокола"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "В списке портов допустима одна запятая"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "Номер порта должен быть целым числом"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "Строка может содержать только печатные ASCII символы."
#: workflows/base.py:71
msgid "Processing..."
msgstr "Обработка…"
#: workflows/base.py:475
msgid "All available"
msgstr "Все доступные"
#: workflows/base.py:476
msgid "Members"
msgstr "Участники"
#: workflows/base.py:477
msgid "None available."
msgstr "Нет доступных."
#: workflows/base.py:478
msgid "No members."
msgstr "Нет участников."
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s успешно завершено."
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s не завершено."

View File

@ -1,623 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ainur Shakirov <ainur.shakirov.tt@gmail.com>, 2015
# Fedor Tarasenko <feodor.tarasenko@gmail.com>, 2015
# Ilya Alekseyev <ilyaalekseyev@acm.org>, 2015
# Yury Sakarinen, 2014
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 16:36-0500\n"
"PO-Revision-Date: 2015-04-13 12:00+0000\n"
"Last-Translator: Ilya Alekseyev <ilyaalekseyev@acm.org>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/horizon/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "Действие не может быть выполнено. Эта строка содержит ошибки или недостаточную информацию. "
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "Подробная информация"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "Вы можете указать метаданные ресурса перемещением элементов из левого столбца в правый. В левом столбце имеются определения метаданных из каталога метаданных Glance. Используйте опцию \"Другой\" для добавления выбранных вами ключей."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "Мин."
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "Макс."
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "Мин. длина"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "Макс. длина"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "Несоответствие шаблону"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "Требуется целое число"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "Требуется десятичное число"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "Требуется"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "Повторяющиеся ключи не допускаются"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "Фильтр"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "Доступные метаданные"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "Имеющиеся метаданные"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "Выборочный"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "Метаданные недоступны"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "Нет метаданных"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "Отправить"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "Отмена"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "Выделенный"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "Доступно"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "Выберите один"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "Выберите элемент из доступных элементов ниже"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "Нет доступных элементов"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "Показать выделенные элементы"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "Показать все доступные элементы"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "Нажмите для показа или скрытия"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "Переопределите элементы перемещением"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "Нажмите для подробностей"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "Найдено %(found)s из %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "Нажмите для показа ошибок."
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "Назад"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "Вперёд"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "Закончить"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "Подключение"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "Открыт"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "Закрытие"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "Закрыт"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "Статус: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "Да"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "Нет"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s ГБ"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s МБ"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s ТБ"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s кБ"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s байт"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "Отображено %s значение"
msgstr[1] "Отображено %s значений"
msgstr[2] "Отображено %s значений"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "Не удалось получить диски."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "Не удалось получить снимки диска."
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "Не удалось получить конфигурацию пользователя."
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "Не удалось получить конфигурацию администратора."
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "Не удалось получить настройки."
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "Настройка не включена: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "Не удалось получить образ."
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "Не удалось получить образы."
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "Не удалось получить пространство имён."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "Не удалось получить пользователей."
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "Не удалось создать пользователя."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "Не удалось удалить пользователя."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "Не удалось получить текущую сессию пользователя."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "Не удалось получить пользователя."
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "Не удалось изменить пользователя."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "Не удалось удалить пользователя."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "Не удалось получить роль."
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "Не удалось создать роль."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "Не удалось удалить роли."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "Не удалось получить роль"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "Не удалось изменить роль."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "Не удалось удалить роль."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "Не удалось получить домены."
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "Не удалось создать домен."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "Не удалось удалить домены."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "Не удалось получить домен."
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "Не удалось изменить домен."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "Не удалось удалить домен."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "Не удалось получить проекты"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "Не удалось создать проект"
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "Не удалось удалить проекты."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "Не удалось получить проект"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "Не удалось изменить проект."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "Не удалось удалить проект."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "Не удалось предоставить роль."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "Не удалось получить службу каталогов."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "Тип службы не включен: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "Не удалось получить службу каталогов с Keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "Не удалось получить сети."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "Не удалось создать сеть."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "Не удалось получить подсети."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "Не удалось создать подсеть."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "Не удалось получить порты."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Не удалось получить пары ключей."
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "Не удалось импортировать пару ключей."
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Не удалось создать пару ключей."
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Не удалось получить зоны доступности."
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Не удалось получить лимиты."
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Не удалось создать сервер."
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Не удалось получить сервер."
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Не удалось получить расширения."
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Не удалось получить типы инстанса."
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Не удалось получить тип инстанса."
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Не удалось получить доп. параметры типа интанса."
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Расширение не включено: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Не удалось получить список расширений nova."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "Проверка политики не удалась."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "Не удалось получить группы безопасности."
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "Загрузка"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "Нет данных."
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "Произошла ошибка. Повторите попытку."
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "Обнаружена проблема при соединении с сервером. Повторите попытку."
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "Не удалось прочитать файл"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "Не удалось расшифровать пароль"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "Нет ролей"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "Роли"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "Опасность:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "Внимание:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "Примечание:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "Успешно:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "Ошибка:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "Обработка"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "При отправке формы произошла ошибка. Повторите попытку."
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "Нет"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "Удалить"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "СОСТОЯНИЕ"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "Интерфейсы"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "Удалить интерфейс"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "Открыть консоль"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "Просмотреть детали"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "Удалить маршрутизатор"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "Посмотреть информацию о маршрутизаторе"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "Добавить Интерфейс"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "Удалить инстанс"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "Посмотреть информацию об инстансе."
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "Нет элементов для отображения."
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "Во время обновления произошла ошибка."
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "Выбрано %s."
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "Подтвердите %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "Подтвердите свой выбор."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "Нет прав для выполнения."
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "Пароли не совпадают."

View File

@ -1,509 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# ChangBo Guo(gcb) <glongwave@gmail.com>, 2014
# LIU Yulong <dragon889@163.com>, 2014-2015
# Xiao Xi LIU <liuxx@cn.ibm.com>, 2014
# Ying Chun Guo <daisy.ycguo@gmail.com>, 2015
# 颜海峰 <yanheven@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-01 22:52+0000\n"
"Last-Translator: 颜海峰 <yanheven@gmail.com>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/horizon/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: base.py:475
msgid "Other"
msgstr "其它"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "导航条目"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "选择一个%s 浏览。"
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "密码没有接受"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "请先登录。"
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "您无权访问 %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "已经存在一个资源%(resource)s名称为\"%(name)s\"。"
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "无权: %s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "未授权。请尝试重新登录。"
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "不正确的IP地址格式"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "IP 地址版本无效"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "无效的子网掩码"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "提交"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "取消"
#: middleware.py:103
msgid "Session timed out."
msgstr "会话超时。"
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "筛选"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "这个动作不能撤消。"
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "您被禁止执行 %(action)s: %(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "无法执行 %(action)s: %(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s: %(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "删除"
#: tables/actions.py:917
msgid "Deleted"
msgstr "已删除"
#: tables/actions.py:948
msgid "Update"
msgstr "更新"
#: tables/actions.py:949
msgid "Updated"
msgstr "已更新"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "属性 %(attr)s 并不存在于 %(obj)s。"
#: tables/base.py:990
msgid "No items to display."
msgstr "没有条目显示。"
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "动作"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "id \"%s\" 没有匹配的返回顶。"
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "请在执行前选择一行。"
#: tables/base.py:1570
msgid "N/A"
msgstr "无"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "登录身份: %(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "帮助"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "退出"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n如果你不确定使用哪种认证方式请联系管理员。"
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "登录"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "你没有被授权访问这些资源:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "使用其他用户登录或返回 <a href=\"%(home_url)s\">首页</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "登入"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "连接"
#: templates/auth/login.html:4
msgid "Login"
msgstr "登录"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "信息:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "警告:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "成功:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "错误:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "概要"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "正在显示 %(counter)s 项"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;前页"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "后页&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "更多操作"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s:"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "增加一行"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "上限摘要"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "实例"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "<span> %(available)s </span>中的<span> %(used)s </span>已使用"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "虚拟处理器VCPU"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "内存"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "浮动IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "已分配 <span> %(used)s </span> 于 <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "安全组"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "云硬盘"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "卷存储"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "保存"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "正在显示 %(nav_items)s 项"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "正在显示 %(content_items)s 项"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "使用情况摘要"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "选择一段时间来查询其用量:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n<label>从:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n<label>到:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "日期应是YYYY-mm-dd格式。"
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "运行的云主机:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "活跃的内存:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "这一时期的VCPU-小时数:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "这一时期的GB-小时数:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "这一时期的内存-小时数"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "返回"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "下一步"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "控制面板"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "无限制"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "可用配额"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d 字节"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0字节"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "出售小狗"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "已售出的小狗"
#: test/tests/views.py:59
msgid "Fake"
msgstr "伪"
#: utils/filters.py:49
msgid "Never"
msgstr "从不"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "不是一个有效的端口号"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "不是一个有效的IP协议号"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "用冒号分隔端口区间"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "端口号必须为整数"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "字符串只能包含ASCII可印刷字符."
#: workflows/base.py:71
msgid "Processing..."
msgstr "正在处理中, 请稍候..."
#: workflows/base.py:475
msgid "All available"
msgstr "所有可用成员"
#: workflows/base.py:476
msgid "Members"
msgstr "成员"
#: workflows/base.py:477
msgid "None available."
msgstr "没有可用成员。"
#: workflows/base.py:478
msgid "No members."
msgstr "没有成员。"
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "%s 成功完成。"
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "%s 没有完成。"

View File

@ -1,623 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Alfred <alfredhuang211@qq.com>, 2015
# johnwoo_lee <lijiangsheng1@gmail.com>, 2015
# LIU Yulong <dragon889@163.com>, 2014-2015
# Tom Fifield <tom@openstack.org>, 2015
# Xiao Xi LIU <liuxx@cn.ibm.com>, 2014
# Ying Chun Guo <daisy.ycguo@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 01:16-0500\n"
"PO-Revision-Date: 2015-04-20 07:06+0000\n"
"Last-Translator: Ying Chun Guo <daisy.ycguo@gmail.com>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/horizon/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "不能执行该操作。该列的内容有错或是缺少信息。"
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "详细信息"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "你可以通过从左边栏目目录选择到右边栏目来指定资源的元数据。在左边栏目是按照glance 元数据目录来定义的元数据。使用\"其他\"选项来增加元数据。"
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "最小"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "最大"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "最小长度"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "最大长度"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "模式不匹配"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "必须是整数"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "必须是小数"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "必须"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "复制密钥是不允许的"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "筛选"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "可用的元数据"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "已存在的元数据"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "定制"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "没有可用的元数据"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "不存在的元数据"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "提交"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "取消"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "已分配"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "可用配额"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "选择一个"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "从以下可选项中选择一项"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "没有可选项"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "展开可见已分配项"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "展开可见可选项"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "点击此处展现或隐藏"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "使用拖放重新排序"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "点击查看更多细节"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "共有%(total)s已找到%(found)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "点击此处展开,并可浏览错误。"
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "返回"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "下一步"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "结束"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "连接中"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "打开"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "关闭中"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "已关闭"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "状态: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "是"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "不"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s 字节"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "正在显示 %s 项"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "无法获取云硬盘"
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "找不到云硬盘快照。"
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "无法获取用户配置"
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "无法获取管理员配置"
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "无法获取配置"
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "配置没有启用: %(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "无法检索到镜像。"
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "找不到镜像。"
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "无法获取命名空间"
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "无法获取用户"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "无法创建用户。"
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "无法删除用户"
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "无法获取当前用户会话。"
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "无法获取用户"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "无法编辑用户"
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "无法删除用户"
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "无法获取角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "无法创建角色。"
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "无法删除角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "无法获取角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "无法编辑角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "无法删除角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "无法获取域"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "无法创建域"
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "无法删除域"
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "无法获取域"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "无法编辑域"
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "无法删除域"
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "无法获取项目"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "无法创建项目"
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "无法删除项目"
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "无法获取项目"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "无法编辑项目"
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "无法删除项目"
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "无法授予角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "无法取得服务目录"
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "服务类型未激活:%(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "无法由keystone获取服务目录。"
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "无法获取网络"
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "无法创建网络"
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "无法获取子网"
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "无法创建子网"
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "无法获取端口"
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "无法获取密钥对"
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "无法导入密钥对"
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "无法创建密匙对"
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "无法获取可用域。"
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "无法获取界限"
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "无法创建服务器"
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "无法获取服务器"
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "无法获取扩展"
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "无法获取云主机类型列表。"
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "无法获取云主机类型"
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "无法获取云主机类型特别设定"
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "扩展没有启动: %(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "无法查询nova扩展列表"
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "策略检查失败"
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "无法获取安全组。"
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "加载中"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "没有可用数据"
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "发生错误。请稍后重试。"
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "与服务器通信出现问题,请再试一次。"
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "不能读取文件"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "不能解密密码"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "不存在任何角色"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "角色"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "危险:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "警告:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "注意:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "成功:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "错误:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "进行中"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "在提交表单的时候出现错误,请再次尝试。"
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "无"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "删除"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "状态"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "ID"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "接口"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "删除接口"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "打开控制台"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "查看详情"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "删除路由"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "查看路由详情"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "增加接口"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "终止实例"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "查看实例详情"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "没有条目显示。"
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "更新时发生错误。"
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "你已经选择了 %s 。 "
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "确认 %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "请确认您的选择。"
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "未授权不能进行此操作。"
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "密码不匹配。"

View File

@ -1,507 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Chen, Shang-Pin <dreamerwolf.tw@gmail.com>, 2015
# Xiao Xi LIU <liuxx@cn.ibm.com>, 2014
# Zhang Xiaowei <zero00072@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-06 21:07-0500\n"
"PO-Revision-Date: 2015-04-02 05:22+0000\n"
"Last-Translator: Zhang Xiaowei <zero00072@gmail.com>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/horizon/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: base.py:475
msgid "Other"
msgstr "其他"
#: browsers/base.py:88
msgid "Navigation Item"
msgstr "導覽項目"
#: browsers/views.py:41
#, python-format
msgid "Select a %s to browse."
msgstr "選擇 %s 來瀏覽。"
#: conf/default.py:41
msgid "Password is not accepted"
msgstr "不允許密碼"
#: decorators.py:53
msgid "Please log in to continue."
msgstr "請登入以繼續。"
#: decorators.py:85
#, python-format
msgid "You are not authorized to access %s"
msgstr "您沒有足夠的權限存取 %s"
#: exceptions.py:163
#, python-format
msgid "A %(resource)s with the name \"%(name)s\" already exists."
msgstr "名為「%(name)s」的 %(resource)s 已經存在。"
#: exceptions.py:235
#, python-format
msgid "Unauthorized: %s"
msgstr "未授權:%s"
#: exceptions.py:238
msgid "Unauthorized. Please try logging in again."
msgstr "未授權。請試著重新登入。"
#: forms/fields.py:64
msgid "Incorrect format for IP address"
msgstr "不正確的 IP 位址格式"
#: forms/fields.py:65
msgid "Invalid version for IP address"
msgstr "無效的 IP 位址版本"
#: forms/fields.py:66
msgid "Invalid subnet mask"
msgstr "無效的子網路遮罩"
#: forms/views.py:132 templates/horizon/common/_usage_summary.html:16
msgid "Submit"
msgstr "提交"
#: forms/views.py:133
#: templates/horizon/common/_modal_form_update_metadata.html:25
#: templates/horizon/common/_workflow.html:49
msgid "Cancel"
msgstr "取消"
#: middleware.py:103
msgid "Session timed out."
msgstr "連線階段過期。"
#: tables/actions.py:460
#: templates/horizon/common/_data_table_table_actions.html:21
#: templates/horizon/common/_data_table_table_actions.html:33
#: templates/horizon/common/_workflow_step_update_members.html:14
#: templates/horizon/common/_workflow_step_update_members.html:23
msgid "Filter"
msgstr "篩選"
#: tables/actions.py:645
msgid "This action cannot be undone."
msgstr "這個動作將無法回復。"
#: tables/actions.py:767
#, python-format
msgctxt "past"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:769
#, python-format
msgctxt "present"
msgid "%(action)s %(data_type)s"
msgstr "%(action)s %(data_type)s"
#: tables/actions.py:832
#, python-format
msgid "You are not allowed to %(action)s: %(objs)s"
msgstr "不允許您%(action)s%(objs)s"
#: tables/actions.py:839
#, python-format
msgid "Unable to %(action)s: %(objs)s"
msgstr "無法%(action)s%(objs)s"
#: tables/actions.py:845
#, python-format
msgid "%(action)s: %(objs)s"
msgstr "%(action)s%(objs)s"
#: tables/actions.py:915
msgid "Delete"
msgstr "刪除"
#: tables/actions.py:917
msgid "Deleted"
msgstr "已刪除"
#: tables/actions.py:948
msgid "Update"
msgstr "更新"
#: tables/actions.py:949
msgid "Updated"
msgstr "已更新"
#: tables/base.py:305
msgid "-"
msgstr "-"
#: tables/base.py:361
#, python-format
msgid "The attribute %(attr)s doesn't exist on %(obj)s."
msgstr "%(obj)s 不存在 %(attr)s 屬性。"
#: tables/base.py:990
msgid "No items to display."
msgstr "沒有項目可以列出。"
#: tables/base.py:1099
#: templates/horizon/common/_data_table_table_actions.html:47
msgid "Actions"
msgstr "動作"
#: tables/base.py:1329
#, python-format
msgid "No match returned for the id \"%s\"."
msgstr "沒有符合識別號「%s」的結果。"
#: tables/base.py:1486
msgid "Please select a row before taking that action."
msgstr "執行動作前請選擇欄位。"
#: tables/base.py:1570
msgid "N/A"
msgstr "N/A"
#: templates/_header.html:5
#, python-format
msgid "Logged in as: %(username)s"
msgstr "以此身份登入:%(username)s"
#: templates/_header.html:7
msgid "Help"
msgstr "幫助"
#: templates/_header.html:9
msgid "Sign Out"
msgstr "登出"
#: templates/auth/_description.html:9
msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
msgstr "\n 若您不確定要用哪個驗證方法,請聯絡您的管理員。\n "
#: templates/auth/_login.html:5
msgid "Log In"
msgstr "登入"
#: templates/auth/_login.html:27
msgid "You do not have permission to access the resource:"
msgstr "您沒有權限存取資源:"
#: templates/auth/_login.html:29
#, python-format
msgid ""
"Login as different user or go back to <a href=\"%(home_url)s\"> home "
"page</a>"
msgstr "以不同的用戶身份登入,或者回到<a href=\"%(home_url)s\">首頁</a>"
#: templates/auth/_login.html:45
msgid "Sign In"
msgstr "登入"
#: templates/auth/_login.html:46
msgid "Connect"
msgstr "連線"
#: templates/auth/login.html:4
msgid "Login"
msgstr "登入"
#: templates/horizon/_messages.html:7
msgid "Info: "
msgstr "資訊:"
#: templates/horizon/_messages.html:13
msgid "Warning: "
msgstr "警告:"
#: templates/horizon/_messages.html:19
msgid "Success: "
msgstr "成功:"
#: templates/horizon/_messages.html:25
msgid "Error: "
msgstr "錯誤:"
#: templates/horizon/common/_data_table.html:63
msgid "Summary"
msgstr "摘要"
#: templates/horizon/common/_data_table.html:72
#, python-format
msgid "Displaying %(counter)s item"
msgid_plural "Displaying %(counter)s items"
msgstr[0] "顯示 %(counter)s 項"
#: templates/horizon/common/_data_table.html:77
msgid "&laquo;&nbsp;Prev"
msgstr "&laquo;&nbsp;上一頁"
#: templates/horizon/common/_data_table.html:80
msgid "Next&nbsp;&raquo;"
msgstr "下一頁&nbsp;&raquo;"
#: templates/horizon/common/_data_table_table_actions.html:45
msgid "More Actions"
msgstr "更多動作"
#: templates/horizon/common/_domain_page_header.html:6
#, python-format
msgid "%(context_name)s:"
msgstr "%(context_name)s"
#: templates/horizon/common/_formset_table.html:35
msgid "Add a row"
msgstr "加入一列"
#: templates/horizon/common/_formset_table_row.html:15
#, python-format
msgid "%(name)s: %(error)s"
msgstr "%(name)s: %(error)s"
#: templates/horizon/common/_limit_summary.html:4
msgid "Limit Summary"
msgstr "限制摘要"
#: templates/horizon/common/_limit_summary.html:7
msgid "Instances"
msgstr "雲實例"
#: templates/horizon/common/_limit_summary.html:8
#: templates/horizon/common/_limit_summary.html:15
#: templates/horizon/common/_limit_summary.html:22
#: templates/horizon/common/_limit_summary.html:36
#: templates/horizon/common/_limit_summary.html:43
#: templates/horizon/common/_limit_summary.html:50
#, python-format
msgid "Used <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "已使用 <span>%(available)s</span> 個中的 <span>%(used)s</span> 個"
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
msgstr "虛擬處理器數"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
msgstr "隨機存取記憶體"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
msgstr "浮動 IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
msgstr "已配置 <span> %(available)s </span> 中的 <span> %(used)s </span> "
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
msgstr "安全性群組"
#: templates/horizon/common/_limit_summary.html:42
msgid "Volumes"
msgstr "雲硬碟"
#: templates/horizon/common/_limit_summary.html:49
msgid "Volume Storage"
msgstr "雲硬碟儲存空間"
#: templates/horizon/common/_modal_form_update_metadata.html:24
#: workflows/base.py:594
msgid "Save"
msgstr "儲存"
#: templates/horizon/common/_resource_browser.html:10
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
msgstr[0] "顯示 %(nav_items)s 項"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
msgstr[0] "顯示 %(content_items)s 項"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
msgstr "使用量摘要"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
msgstr "選擇時段查詢使用量:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
msgid ""
"\n"
" <label>From:</label> %(start)s"
msgstr "\n <label>自從:</label> %(start)s"
#: templates/horizon/common/_usage_summary.html:13
#, python-format
msgid ""
"\n"
" <label>To:</label>%(end)s"
msgstr "\n <label>直到:</label>%(end)s"
#: templates/horizon/common/_usage_summary.html:17
msgid "The date should be in YYYY-mm-dd format."
msgstr "日期的格式應該為 YY-mm-dd。"
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
msgstr "使用中的雲實例:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
msgstr "使用中的隨機存取記憶體:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
msgstr "此時段的虛擬處理器時數:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
msgstr "此時段的硬碟 GB 時數:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
msgstr "此時段的虛擬記憶體時數:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
msgstr "上一頁"
#: templates/horizon/common/_workflow.html:43
msgid "Next"
msgstr "下一頁"
#: templatetags/branding.py:34
msgid "Horizon"
msgstr "Horizon"
#: templatetags/horizon.py:137 templatetags/horizon.py:148
msgid "No Limit"
msgstr "不限制"
#: templatetags/horizon.py:140 templatetags/horizon.py:142
msgid "Available"
msgstr "可用"
#: templatetags/sizeformat.py:51 templatetags/sizeformat.py:56
#, python-format
msgid "%(size)d Byte"
msgid_plural "%(size)d Bytes"
msgstr[0] "%(size)d 位元組"
#: templatetags/sizeformat.py:59
#, python-format
msgid "%s KB"
msgstr "%s KB"
#: templatetags/sizeformat.py:61
#, python-format
msgid "%s MB"
msgstr "%s MB"
#: templatetags/sizeformat.py:63
#, python-format
msgid "%s GB"
msgstr "%s GB"
#: templatetags/sizeformat.py:65
#, python-format
msgid "%s TB"
msgstr "%s TB"
#: templatetags/sizeformat.py:66
#, python-format
msgid "%s PB"
msgstr "%s PB"
#: templatetags/sizeformat.py:74
msgid "0 Bytes"
msgstr "0 位元組"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
msgstr[0] "販賣小狗"
#. Translators: test code, don't really have to translate
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
msgstr[0] "已賣出小狗"
#: test/tests/views.py:59
msgid "Fake"
msgstr "假冒"
#: utils/filters.py:49
msgid "Never"
msgstr "永不"
#: utils/validators.py:26 utils/validators.py:50
msgid "Not a valid port number"
msgstr "不是有效的埠口號碼"
#: utils/validators.py:31
msgid "Not a valid IP protocol number"
msgstr "不是有效的 IP 協定號碼"
#: utils/validators.py:45
msgid "One colon allowed in port range"
msgstr "允許以冒號隔開埠口範圍"
#: utils/validators.py:52
msgid "Port number must be integer"
msgstr "埠口號碼必須是整數"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
msgstr "字串只能包含 ASCII 可印出的字元。"
#: workflows/base.py:71
msgid "Processing..."
msgstr "處理中……"
#: workflows/base.py:475
msgid "All available"
msgstr "全部可用"
#: workflows/base.py:476
msgid "Members"
msgstr "成員"
#: workflows/base.py:477
msgid "None available."
msgstr "無可用的。"
#: workflows/base.py:478
msgid "No members."
msgstr "無成員。"
#: workflows/base.py:595
#, python-format
msgid "%s completed successfully."
msgstr "已成功地完成 %s。"
#: workflows/base.py:596
#, python-format
msgid "%s did not complete."
msgstr "尚未完成 %s。"

View File

@ -1,620 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Chen, Shang-Pin <dreamerwolf.tw@gmail.com>, 2015
# Xiao Xi LIU <liuxx@cn.ibm.com>, 2014
# Zhang Xiaowei <zero00072@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-12 16:36-0500\n"
"PO-Revision-Date: 2015-04-13 01:02+0000\n"
"Last-Translator: Zhang Xiaowei <zero00072@gmail.com>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/horizon/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: static/angular/action-list/button-tooltip.js:15
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
msgstr "無法執行動作。這欄的內容有錯或者缺少資訊。"
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
msgstr "詳細的資訊"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
"You can specify resource metadata by moving items from the left column to "
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
msgstr "您可以從左欄移動項目到右欄來指定資源詮釋資料。左欄是來自 Glance 詮釋資料類別的詮釋檔定義。使用「其他」選項來加入您的選擇到詮釋資料裡。"
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
msgstr "最小"
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
msgstr "最大"
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
msgstr "最小長度"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
msgstr "最大長度"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
msgstr "不符合的樣式"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
msgstr "需要整數"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
msgstr "需要十進位"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
msgstr "需要"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
msgstr "不允許重複的鍵值"
#: static/angular/metadata-tree/metadata-tree.js:45
#: static/angular/table/basic-table.js:6
#: static/horizon/js/horizon.forms.js:184
msgid "Filter"
msgstr "篩選"
#: static/angular/metadata-tree/metadata-tree.js:46
msgid "Available Metadata"
msgstr "可用的詮釋資料"
#: static/angular/metadata-tree/metadata-tree.js:47
msgid "Existing Metadata"
msgstr "已存在的詮釋資料"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
msgstr "自訂"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
msgstr "無可用的詮釋資料"
#: static/angular/metadata-tree/metadata-tree.js:50
msgid "No existing metadata"
msgstr "不存在詮釋資料"
#: static/angular/modal/modal.js:83
msgid "Submit"
msgstr "提交"
#: static/angular/modal/modal.js:84 static/angular/wizard/wizard.js:11
#: static/horizon/js/horizon.modals.js:33
msgid "Cancel"
msgstr "取消"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
msgstr "已分配"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
msgstr "可用"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
msgstr "擇一"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
msgstr "從下列可用的項目中選擇"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
msgstr "無可用的項目"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
msgstr "展開來顯示已分配的項目"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
msgstr "展開來顯示可用的項目"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
msgstr "點擊來顯示或隱藏"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
msgstr "使用拖拉來重新排列"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
msgstr "點擊來顯示更多詳細資訊"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
msgstr "已找到 %(total)s 中的 %(found)s 個"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
msgstr "展開這列來檢視錯誤。"
#: static/angular/wizard/wizard.js:12
msgid "Back"
msgstr "上一步"
#: static/angular/wizard/wizard.js:13
msgid "Next"
msgstr "下一步"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
msgstr "完成"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
msgstr "連線中"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
msgstr "開啟"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
msgstr "關閉中"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
msgstr "已關閉"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
msgstr "狀態:%s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
msgstr "是"
#: static/horizon/js/angular/filters/filters.js:37
msgid "No"
msgstr "否"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
#, c-format
msgid "%s GB"
msgstr "%s GB"
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
#, c-format
msgid "%s MB"
msgstr "%s MB"
#: static/horizon/js/angular/filters/filters.js:138
#, c-format
msgid "%s TB"
msgstr "%s TB"
#: static/horizon/js/angular/filters/filters.js:144
#, c-format
msgid "%s KB"
msgstr "%s KB"
#: static/horizon/js/angular/filters/filters.js:146
#, c-format
msgid "%s bytes"
msgstr "%s 位元組"
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
msgstr[0] "顯示 %s 項"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
msgstr "無法獲得雲硬碟。"
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
msgstr "無法獲得雲硬碟即時存檔。"
#: static/horizon/js/angular/services/hz.api.config.js:43
msgid "Unable to retrieve user configuration."
msgstr "無法獲得用戶設定檔。"
#: static/horizon/js/angular/services/hz.api.config.js:62
msgid "Unable to retrieve admin configuration."
msgstr "無法獲得管理員設定檔。"
#: static/horizon/js/angular/services/hz.api.config.js:105
msgid "Unable to retrieve settings."
msgstr "無法設定。"
#: static/horizon/js/angular/services/hz.api.config.js:289
msgid "Setting is not enabled: %(setting)s"
msgstr "未啟用設定:%(setting)s"
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
msgstr "無法獲得映像檔。"
#: static/horizon/js/angular/services/hz.api.glance.js:81
msgid "Unable to retrieve images."
msgstr "無法獲得映像檔。"
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
msgstr "無法獲得名稱空間。"
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
msgstr "無法獲得名稱用戶。"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
msgstr "無法新增用戶。"
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
msgstr "無法刪除用戶。"
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
msgstr "無法獲得目前用戶連線階段。"
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
msgstr "無法獲得用戶。"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
msgstr "無法編輯用戶。"
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
msgstr "無法刪除用戶。"
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
msgstr "無法獲得角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
msgstr "無法新增角色。"
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
msgstr "無法刪除角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
msgstr "無法獲得角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
msgstr "無法編輯角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
msgstr "無法刪除角色"
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
msgstr "無法獲得地域"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
msgstr "無法新增地域。"
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
msgstr "無法刪除地域。"
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
msgstr "無法獲得地域"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
msgstr "無法編輯地域。"
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
msgstr "無法刪除地域。"
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
msgstr "無法獲得專案"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
msgstr "無法新增專案。"
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
msgstr "無法刪除專案。"
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
msgstr "無法獲得專案"
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
msgstr "無法編輯專案。"
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
msgstr "無法刪除專案。"
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
msgstr "無法賦予角色權力。"
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
msgstr "無法獲得伺服器類別。"
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
msgstr "未啟用伺服器類型:%(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
msgstr "不能從 Keystone 獲得伺服器類別。"
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
msgstr "無法獲得網路。"
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
msgstr "無法新增網路。"
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
msgstr "無法獲得子網路。"
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
msgstr "無法新增子網路。"
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
msgstr "無法獲得接口。"
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "無法獲得密鑰對。"
#: static/horizon/js/angular/services/hz.api.nova.js:62
msgid "Unable to import the keypair."
msgstr "無法匯入密鑰對。"
#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "無法新增密鑰對。"
#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "無法獲得可用區域。"
#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "無法獲得限制。"
#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "無法新增伺服器。"
#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "無法獲得伺服器。"
#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "無法獲得擴充套件。"
#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "無法獲得虛擬硬體樣板。"
#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "無法獲得虛擬硬體樣板。"
#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "無法獲得虛擬硬體樣板額外規格。"
#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "未啟用擴充套件:%(extension)s"
#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "不能獲得 Nova 擴充套件列表。"
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
msgstr "檢查政策時失敗。"
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
msgstr "無法獲得安全性群組。"
#: static/horizon/js/horizon.accordion_nav.js:78
#: static/horizon/js/horizon.modals.js:315
#: static/horizon/js/horizon.tabs.js:21
msgid "Loading"
msgstr "讀取中"
#: static/horizon/js/horizon.d3linechart.js:394
#: static/horizon/js/horizon.d3linechart.js:404
msgid "No data available."
msgstr "無可用的資料。"
#: static/horizon/js/horizon.d3linechart.js:410
#: static/horizon/js/horizon.modals.js:334
#: static/horizon/js/horizon.tables_inline_edit.js:94
#: static/horizon/js/horizon.tables_inline_edit.js:157
msgid "An error occurred. Please try again later."
msgstr "發生錯誤。請稍後再試。"
#: static/horizon/js/horizon.firewalls.js:32
#: static/horizon/js/horizon.instances.js:31
msgid "There was a problem communicating with the server, please try again."
msgstr "與伺服器間的通訊有問題,請再試一次。"
#: static/horizon/js/horizon.instances.js:273
msgid "Could not read the file"
msgstr "不能讀取檔案"
#: static/horizon/js/horizon.instances.js:279
#: static/horizon/js/horizon.instances.js:308
msgid "Could not decrypt the password"
msgstr "不能解鎖密碼"
#: static/horizon/js/horizon.membership.js:190
msgid "No roles"
msgstr "無角色"
#: static/horizon/js/horizon.membership.js:222
msgid "Roles"
msgstr "角色"
#: static/horizon/js/horizon.messages.js:9
msgid "Danger: "
msgstr "危險:"
#: static/horizon/js/horizon.messages.js:10
msgid "Warning: "
msgstr "警告:"
#: static/horizon/js/horizon.messages.js:11
msgid "Notice: "
msgstr "注意:"
#: static/horizon/js/horizon.messages.js:12
msgid "Success: "
msgstr "成功:"
#: static/horizon/js/horizon.messages.js:13
msgid "Error: "
msgstr "錯誤:"
#: static/horizon/js/horizon.modals.js:229
#: static/horizon/js/horizon.tables.js:218
msgid "Working"
msgstr "運作中"
#: static/horizon/js/horizon.modals.js:263
msgid "There was an error submitting the form. Please try again."
msgstr "提交表單時有錯誤。請再試一次。"
#: static/horizon/js/horizon.networktopology.js:530
#: static/horizon/js/horizon.networktopology.js:536
msgid "None"
msgstr "無"
#: static/horizon/js/horizon.networktopology.js:549
msgid "Delete"
msgstr "刪除"
#: static/horizon/js/horizon.networktopology.js:552
msgid "STATUS"
msgstr "狀態"
#: static/horizon/js/horizon.networktopology.js:553
msgid "ID"
msgstr "識別號"
#: static/horizon/js/horizon.networktopology.js:554
msgid "Interfaces"
msgstr "網路卡介面"
#: static/horizon/js/horizon.networktopology.js:555
msgid "Delete Interface"
msgstr "刪除網路卡介面"
#: static/horizon/js/horizon.networktopology.js:556
msgid "Open Console"
msgstr "開啟終端機"
#: static/horizon/js/horizon.networktopology.js:557
msgid "View Details"
msgstr "檢視詳細資訊"
#: static/horizon/js/horizon.networktopology.js:560
msgid "Delete Router"
msgstr "刪除路由器"
#: static/horizon/js/horizon.networktopology.js:561
msgid "View Router Details"
msgstr "檢視路由器詳細資訊"
#: static/horizon/js/horizon.networktopology.js:564
msgid "Add Interface"
msgstr "加入網路卡介面"
#: static/horizon/js/horizon.networktopology.js:570
msgid "Terminate Instance"
msgstr "終止雲實例"
#: static/horizon/js/horizon.networktopology.js:571
msgid "View Instance Details"
msgstr "檢視雲實例詳細資訊"
#: static/horizon/js/horizon.tables.js:39
#: static/horizon/js/horizon.tables.js:406
msgid "No items to display."
msgstr "沒有項目可以列出。"
#: static/horizon/js/horizon.tables.js:52
#: static/horizon/js/horizon.tables.js:120
msgid "An error occurred while updating."
msgstr "更新時發生錯誤。"
#: static/horizon/js/horizon.tables.js:201
#, c-format
msgid "You have selected %s. "
msgstr "您選擇了 %s。"
#: static/horizon/js/horizon.tables.js:203
#, c-format
msgid "Confirm %s"
msgstr "確認 %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
msgstr "請確認您的選擇。"
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
msgid "Not authorized to do this operation."
msgstr "沒有足夠的權限執行這個操作。"
#: static/horizon/js/horizon.users.js:18
msgid "Passwords do not match."
msgstr "密碼沒有相配。"

View File

@ -1,71 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import glob
from optparse import make_option # noqa
import os
from django.core.management.base import CommandError # noqa
from django.core.management.templates import TemplateCommand # noqa
from django.utils.importlib import import_module # noqa
import horizon
class Command(TemplateCommand):
template = os.path.join(horizon.__path__[0], "conf", "dash_template")
option_list = TemplateCommand.option_list + (
make_option('--target',
dest='target',
action='store',
default=None,
help='The directory in which the panel '
'should be created. Defaults to the '
'current directory. The value "auto" '
'may also be used to automatically '
'create the panel inside the specified '
'dashboard module.'),)
help = ("Creates a Django app directory structure for a new dashboard "
"with the given name in the current directory or optionally in "
"the given directory.")
def handle(self, dash_name=None, **options):
if dash_name is None:
raise CommandError("You must provide a dashboard name.")
# Use our default template if one isn't specified.
if not options.get("template", None):
options["template"] = self.template
# We have html templates as well, so make sure those are included.
options["extensions"].extend(["tmpl", "html", "js", "css"])
# Check that the app_name cannot be imported.
try:
import_module(dash_name)
except ImportError:
pass
else:
raise CommandError("%r conflicts with the name of an existing "
"Python module and cannot be used as an app "
"name. Please try another name." % dash_name)
super(Command, self).handle('dash', dash_name, **options)
target = options.pop("target", None)
if not target:
target = os.path.join(os.curdir, dash_name)
# Rename our python template files.
file_names = glob.glob(os.path.join(target, "*.py.tmpl"))
for filename in file_names:
os.rename(filename, filename[:-5])

View File

@ -1,105 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import glob
from optparse import make_option # noqa
import os
from django.core.management.base import CommandError # noqa
from django.core.management.templates import TemplateCommand # noqa
from django.utils.importlib import import_module # noqa
import horizon
class Command(TemplateCommand):
args = "[name] [dashboard name] [optional destination directory]"
option_list = TemplateCommand.option_list + (
make_option('--dashboard', '-d',
dest='dashboard',
action='store',
default=None,
help='The dotted python path to the '
'dashboard which this panel will be '
'registered with.'),
make_option('--target',
dest='target',
action='store',
default=None,
help='The directory in which the panel '
'should be created. Defaults to the '
'current directory. The value "auto" '
'may also be used to automatically '
'create the panel inside the specified '
'dashboard module.'),)
template = os.path.join(horizon.__path__[0], "conf", "panel_template")
help = ("Creates a Django app directory structure for a new panel "
"with the given name in the current directory or optionally in "
"the given directory.")
def handle(self, panel_name=None, **options):
if panel_name is None:
raise CommandError("You must provide a panel name.")
if options.get('dashboard'):
dashboard_path = options.get('dashboard')
dashboard_mod_path = ".".join([dashboard_path, "dashboard"])
# Check the dashboard.py file in the dashboard app can be imported.
# Add the dashboard information to our options to pass along if all
# goes well.
try:
dashboard_mod = import_module(dashboard_mod_path)
options["dash_path"] = dashboard_path
options["dash_name"] = dashboard_path.split(".")[-1]
except ImportError:
raise CommandError("A dashboard.py module could not be "
"imported from the dashboard at %r."
% options.get("dashboard"))
target = options.pop("target", None)
if target == "auto":
target = os.path.join(os.path.dirname(dashboard_mod.__file__),
panel_name)
if not os.path.exists(target):
try:
os.mkdir(target)
except OSError as exc:
raise CommandError("Unable to create panel directory: %s"
% exc)
# Use our default template if one isn't specified.
if not options.get("template", None):
options["template"] = self.template
# We have html templates as well, so make sure those are included.
options["extensions"].extend(["tmpl", "html"])
# Check that the app_name cannot be imported.
try:
import_module(panel_name)
except ImportError:
pass
else:
raise CommandError("%r conflicts with the name of an existing "
"Python module and cannot be used as an app "
"name. Please try another name." % panel_name)
super(Command, self).handle('panel', panel_name, target, **options)
if not target:
target = os.path.join(os.curdir, panel_name)
# Rename our python template files.
file_names = glob.glob(os.path.join(target, "*.py.tmpl"))
for filename in file_names:
os.rename(filename, filename[:-5])

View File

@ -1,83 +0,0 @@
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Drop-in replacement for django.contrib.messages which handles Horizon's
messaging needs (e.g. AJAX communication, etc.).
"""
from django.contrib import messages as _messages
from django.contrib.messages import constants
from django.utils.encoding import force_text
from django.utils.safestring import SafeData # noqa
def horizon_message_already_queued(request, message):
_message = force_text(message)
if request.is_ajax():
for tag, msg, extra in request.horizon['async_messages']:
if _message == msg:
return True
else:
for msg in _messages.get_messages(request)._queued_messages:
if msg.message == _message:
return True
return False
def add_message(request, level, message, extra_tags='', fail_silently=False):
"""Attempts to add a message to the request using the 'messages' app."""
if not horizon_message_already_queued(request, message):
if request.is_ajax():
tag = constants.DEFAULT_TAGS[level]
# if message is marked as safe, pass "safe" tag as extra_tags so
# that client can skip HTML escape for the message when rendering
if isinstance(message, SafeData):
extra_tags = extra_tags + ' safe'
request.horizon['async_messages'].append([tag,
force_text(message),
extra_tags])
else:
return _messages.add_message(request, level, message,
extra_tags, fail_silently)
def debug(request, message, extra_tags='', fail_silently=False):
"""Adds a message with the ``DEBUG`` level."""
add_message(request, constants.DEBUG, message, extra_tags=extra_tags,
fail_silently=fail_silently)
def info(request, message, extra_tags='', fail_silently=False):
"""Adds a message with the ``INFO`` level."""
add_message(request, constants.INFO, message, extra_tags=extra_tags,
fail_silently=fail_silently)
def success(request, message, extra_tags='', fail_silently=False):
"""Adds a message with the ``SUCCESS`` level."""
add_message(request, constants.SUCCESS, message, extra_tags=extra_tags,
fail_silently=fail_silently)
def warning(request, message, extra_tags='', fail_silently=False):
"""Adds a message with the ``WARNING`` level."""
add_message(request, constants.WARNING, message, extra_tags=extra_tags,
fail_silently=fail_silently)
def error(request, message, extra_tags='', fail_silently=False):
"""Adds a message with the ``ERROR`` level."""
add_message(request, constants.ERROR, message, extra_tags=extra_tags,
fail_silently=fail_silently)

View File

@ -1,220 +0,0 @@
# Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Middleware provided and used by Horizon.
"""
import json
import logging
import time
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME # noqa
from django.contrib.auth.views import redirect_to_login # noqa
from django.contrib import messages as django_messages
from django import http
from django import shortcuts
from django.utils.encoding import iri_to_uri # noqa
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from openstack_auth import utils as auth_utils
from openstack_auth import views as auth_views
import six
from horizon import exceptions
from horizon.utils import functions as utils
LOG = logging.getLogger(__name__)
class HorizonMiddleware(object):
"""The main Horizon middleware class. Required for use of Horizon."""
logout_reason = None
def _check_has_timed_timeout(self, request):
"""Check for session timeout and return timestamp."""
has_timed_out = False
# Activate timezone handling
tz = request.session.get('django_timezone')
if tz:
timezone.activate(tz)
try:
timeout = settings.SESSION_TIMEOUT
except AttributeError:
timeout = 1800
last_activity = request.session.get('last_activity', None)
timestamp = int(time.time())
if (
hasattr(request, "user") and
hasattr(request.user, "token") and not
auth_utils.is_token_valid(request.user.token)
):
# The user was logged in, but his keystone token expired.
has_timed_out = True
if isinstance(last_activity, int):
if (timestamp - last_activity) > timeout:
has_timed_out = True
if has_timed_out:
request.session.pop('last_activity')
return (has_timed_out, timestamp)
def _logout(self, request, login_url=None, message=None):
"""Logout a user and display a logout message."""
response = auth_views.logout(request, login_url)
if message is not None:
self.logout_reason = message
utils.add_logout_reason(request, response, message)
return response
def process_request(self, request):
"""Adds data necessary for Horizon to function to the request."""
request.horizon = {'dashboard': None,
'panel': None,
'async_messages': []}
if not hasattr(request, "user") or not request.user.is_authenticated():
# proceed no further if the current request is already known
# not to be authenticated
# it is CRITICAL to perform this check as early as possible
# to avoid creating too many sessions
return None
# Check for session timeout if user is (or was) authenticated.
has_timed_out, timestamp = self._check_has_timed_timeout(request)
if has_timed_out:
return self._logout(request, request.path, _("Session timed out."))
if request.is_ajax():
# if the request is Ajax we do not want to proceed, as clients can
# 1) create pages with constant polling, which can create race
# conditions when a page navigation occurs
# 2) might leave a user seemingly left logged in forever
# 3) thrashes db backed session engines with tons of changes
return None
# If we use cookie-based sessions, check that the cookie size does not
# reach the max size accepted by common web browsers.
if (
settings.SESSION_ENGINE ==
'django.contrib.sessions.backends.signed_cookies'
):
max_cookie_size = getattr(
settings, 'SESSION_COOKIE_MAX_SIZE', None)
session_cookie_name = getattr(
settings, 'SESSION_COOKIE_NAME', None)
session_key = request.COOKIES.get(session_cookie_name)
if max_cookie_size is not None and session_key is not None:
cookie_size = sum((
len(key) + len(value)
for key, value in six.iteritems(request.COOKIES)
))
if cookie_size >= max_cookie_size:
LOG.error(
'Total Cookie size for user_id: %(user_id)s is '
'%(cookie_size)sB >= %(max_cookie_size)sB. '
'You need to configure file-based or database-backed '
'sessions instead of cookie-based sessions: '
'http://docs.openstack.org/developer/horizon/topics/'
'deployment.html#session-storage'
% {
'user_id': request.session.get(
'user_id', 'Unknown'),
'cookie_size': cookie_size,
'max_cookie_size': max_cookie_size,
}
)
# We have a valid session, so we set the timestamp
request.session['last_activity'] = timestamp
def process_exception(self, request, exception):
"""Catches internal Horizon exception classes such as NotAuthorized,
NotFound and Http302 and handles them gracefully.
"""
if isinstance(exception, (exceptions.NotAuthorized,
exceptions.NotAuthenticated)):
auth_url = settings.LOGIN_URL
next_url = iri_to_uri(request.get_full_path())
if next_url != auth_url:
field_name = REDIRECT_FIELD_NAME
else:
field_name = None
login_url = request.build_absolute_uri(auth_url)
response = redirect_to_login(next_url, login_url=login_url,
redirect_field_name=field_name)
if request.is_ajax():
response_401 = http.HttpResponse(status=401)
response_401['X-Horizon-Location'] = response['location']
return response_401
return response
# If an internal "NotFound" error gets this far, return a real 404.
if isinstance(exception, exceptions.NotFound):
raise http.Http404(exception)
if isinstance(exception, exceptions.Http302):
# TODO(gabriel): Find a way to display an appropriate message to
# the user *on* the login form...
return shortcuts.redirect(exception.location)
def process_response(self, request, response):
"""Convert HttpResponseRedirect to HttpResponse if request is via ajax
to allow ajax request to redirect url
"""
if request.is_ajax() and hasattr(request, 'horizon'):
queued_msgs = request.horizon['async_messages']
if type(response) == http.HttpResponseRedirect:
# Drop our messages back into the session as per usual so they
# don't disappear during the redirect. Not that we explicitly
# use django's messages methods here.
for tag, message, extra_tags in queued_msgs:
getattr(django_messages, tag)(request, message, extra_tags)
if response['location'].startswith(settings.LOGOUT_URL):
redirect_response = http.HttpResponse(status=401)
# This header is used for handling the logout in JS
redirect_response['logout'] = True
if self.logout_reason is not None:
utils.add_logout_reason(
request, redirect_response, self.logout_reason)
else:
redirect_response = http.HttpResponse()
# Use a set while checking if we want a cookie's attributes
# copied
cookie_keys = set(('max_age', 'expires', 'path', 'domain',
'secure', 'httponly', 'logout_reason'))
# Copy cookies from HttpResponseRedirect towards HttpResponse
for cookie_name, cookie in six.iteritems(response.cookies):
cookie_kwargs = dict((
(key, value) for key, value in six.iteritems(cookie)
if key in cookie_keys and value
))
redirect_response.set_cookie(
cookie_name, cookie.value, **cookie_kwargs)
redirect_response['X-Horizon-Location'] = response['location']
return redirect_response
if queued_msgs:
# TODO(gabriel): When we have an async connection to the
# client (e.g. websockets) this should be pushed to the
# socket queue rather than being sent via a header.
# The header method has notable drawbacks (length limits,
# etc.) and is not meant as a long-term solution.
response['X-Horizon-Messages'] = json.dumps(queued_msgs)
return response

View File

@ -1,50 +0,0 @@
# Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 Nebula, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.conf import settings
from django.conf.urls import include
from django.conf.urls import patterns
from django.conf.urls import url
from django.views.generic import TemplateView # noqa
from horizon.test.jasmine import jasmine
urlpatterns = patterns(
'horizon.views',
url(r'^home/$', 'user_home', name='user_home')
)
# Client-side i18n URLconf.
urlpatterns += patterns(
'',
url(r'^i18n/js/(?P<packages>\S+?)/$',
'django.views.i18n.javascript_catalog',
name='jsi18n'),
url(r'^i18n/setlang/$',
'django.views.i18n.set_language',
name="set_language"),
url(r'^i18n/', include('django.conf.urls.i18n'))
)
if settings.DEBUG:
urlpatterns += patterns(
'',
url(r'^qunit/$',
TemplateView.as_view(template_name="horizon/qunit.html"),
name='qunit_tests'),
url(r'^jasmine/(.*?)$', jasmine.dispatcher))

View File

@ -1,206 +0,0 @@
(function() {
'use strict';
/**
* @ngdoc overview
* @name hz.widget.action-list
* @description
*
* # hz.widget.action-list
*
* The `actionList` directive supports displaying a set of buttons
* in a Bootstrap button group or button dropdown (single or split).
*
* | Directives |
* |-----------------------------------------------------------------|
* | {@link hz.widget.action-list.directive:actionList `actionList`} |
* | {@link hz.widget.menu.directive:menu `menu`} |
* | {@link hz.widget.action.directive:action `action`} |
*
*/
angular.module('hz.widget.action-list', [ 'ui.bootstrap' ])
/**
* @ngdoc directive
* @name hz.widget.action-list.directive:actionList
* @element
* @description
* The `actionList` directive is the wrapper for the set of
* actions to be displayed in a Bootstrap button group or
* button dropdown.
*
* The following directives/elements can be declared within
* this directive element: action, menu, and notifications.
* Within the menu directive element, any number of `action`
* directives elements can be declared.
*
* If the action list should be a button dropdown, include
* `dropdown` as an attribute. Additionally, any attribute
* directives can be added (i.e. warning-tooltip).
*
* Notifications are displayed on the bottom right of the
* button group. Declare any number of icons to display
* within the `notifications` element. Use `ng-show` or
* `ng-hide` to dynamically show/hide the icon. Make sure
* to declare <notifications> first to ensure the button
* dropdown border radius will display as expected.
*
* If a button dropdown is required, declare the dropdown
* button with the `button-type` attribute set to
* 'single-button' or 'split-button' for a single button
* dropdown or split button dropdown, respectively. See
* (http://getbootstrap.com/components/#btn-dropdowns).
* The remaining actions should be declared within the
* `menu` directive element with the `button-type` set to
* 'menu-item'. These will be converted to links in the
* dropdown menu.
*
* See the `action` and `menu` directives below for more
* information.
*
* @restrict E
* @example
*
* ```
* <action-list dropdown>
* <notifications>
* <span class="fa fa-exclamation" ng-show="disabled"></span>
* </notifications>
* <action button-type="single-button" action-classes="...">
* Actions
* </action>
* <menu>
* <action button-type="menu-item" callback="..." item="...">
* <span class="fa fa-pencil"></span> Edit
* </action>
* <action button-type="menu-item" callback="..." item="...">
* <span class="fa fa-times"></span> Delete
* </action>
* </menu>
* </action-list>
* ```
*/
.directive('actionList', [ 'basePath', function(path) {
return {
restrict: 'E',
link: function (scope, element, attrs, ctrl, transclude) {
element.addClass('btn-group');
}
};
}
])
/**
* @ngdoc directive
* @name hz.widget.action-list.directive:menu
* @element
* @description
* The `menu` directive is the wrapper for the set of
* actions to be displayed in a dropdown menu in a
* Bootstrap button dropdown. Actions to be displayed
* should be declared within this directive element.
*
* See the `action` directive below for more information.
*
* @restrict E
* @example
*
* ```
* <menu>
* <action button-type="menu-item" callback="..." item="...">
* <span class="fa fa-pencil"></span> Edit
* </action>
* <action button-type="menu-item" callback="..." item="...">
* <span class="fa fa-times"></span> Delete
* </action>
* </menu>
* ```
*/
.directive('menu', [ 'basePath', function(path) {
return {
restrict: 'E',
templateUrl: path + 'action-list/menu.html',
transclude: true,
link: function(scope, element, attrs, ctrl, transclude) {
var menu = element.find('ul');
// Append menu items to menu
transclude(scope, function(clone) {
menu.append(clone);
});
// Don't include directive element since
// it will misalign component look
menu.unwrap();
}
};
}])
/**
* @ngdoc directive
* @name hz.widget.action-list.directive:action
* @element
* @description
* The `action` directive represents the actions to be
* displayed in a Bootstrap button group or button
* dropdown. Any content within this directive element
* will be appended to the button or link element.
*
* There are 4 button types available to an
* action (`button-type` attribute):
*
* Default: <button>
* Single: <button> with caret icon, use 'single-button'
* Split: <button> with caret button, use 'split-button'
* Menu item: <a> wrapped by <li>, use 'menu-item'
*
* Attributes:
*
* actionClasses: classes added to button or link
* callback: function called when button or link clicked
* disabled: disable/enable button dynamically
* item: object passed to callback function
*
* @restrict E
* @scope
* @example
*
* ```
* <action button-type="single-button" action-classes="myClasses">
* Actions
* </action>
*
* <action button-type="split-button" callback="edit" disabled="editDisabled">
* <span class="fa fa-pencil"></span> Edit
* </action>
*
* <action button-type="menu-item" callback="delete" item="row">
* Delete
* </action>
* ```
*/
.directive('action', [ 'basePath', function(path) {
return {
restrict: 'E',
scope: {
actionClasses: '=?',
callback: '=?',
disabled: '=?',
item: '=?'
},
templateUrl: function(element, attrs) {
// Load the template for the action type
var buttonType = attrs.buttonType || 'action';
return path + 'action-list/' + buttonType + '.html';
},
transclude: true,
link: function(scope, element, attrs, ctrl, transclude) {
// Don't include directive element since
// it will misalign component look
element.children().first().unwrap();
}
};
}
]);
}());

View File

@ -1,33 +0,0 @@
action-list.btn-group {
&[button-tooltip] {
cursor: pointer;
}
.dropdown-menu > li {
&.disabled {
opacity: 0.65;
}
> a.text-danger {
color: $brand-danger;
}
}
notifications {
bottom: -0.5em;
opacity: 1;
position: absolute;
right: -0.35em;
z-index: 3;
}
.invalid {
color: $brand-warning;
}
& + .popover a {
cursor: pointer;
}
}

View File

@ -1,187 +0,0 @@
(function() {
'use strict';
describe('hz.widget.action-list module', function() {
it('should have been defined', function() {
expect(angular.module('hz.widget.action-list')).toBeDefined();
});
});
describe('action-list directive', function() {
beforeEach(module('templates'));
beforeEach(module('hz'));
beforeEach(module('hz.widgets'));
beforeEach(module('hz.widget.action-list'));
describe('single button dropdown', function() {
var $scope, $element;
beforeEach(inject(function($injector) {
var $compile = $injector.get('$compile');
$scope = $injector.get('$rootScope').$new();
$scope.testList = [];
$scope.clickMe = function(item) {
$scope.testList.push(item);
};
$scope.item = 'test';
var markup =
'<action-list dropdown>' +
' <action button-type="single-button">Actions</action>' +
' <menu>' +
' <action button-type="menu-item" callback="clickMe" item="item">' +
' Edit' +
' </action>' +
' <action button-type="menu-item" callback="clickMe" item="item">' +
' Delete' +
' </action>' +
' </menu>' +
'</action-list>';
$element = angular.element(markup);
$compile($element)($scope);
$scope.$digest();
}));
it('should have one dropdown button', function() {
var dropdownButton = $element.find('.single-button');
expect(dropdownButton.length).toBe(1);
expect(dropdownButton.text().trim()).toBe('Actions');
});
it('should have 2 menu items', function() {
var menuItems = $element.find('li > a');
expect(menuItems.length).toBe(2);
expect(menuItems[0].textContent.trim()).toBe('Edit');
expect(menuItems[1].textContent.trim()).toBe('Delete');
});
it('should have one item in list if link clicked', function() {
$element.find('li > a').first().click();
expect($scope.testList.length).toBe(1);
expect($scope.testList[0]).toBe('test');
});
});
describe('split button dropdown', function() {
var $scope, $element;
beforeEach(inject(function($injector) {
var $compile = $injector.get('$compile');
$scope = $injector.get('$rootScope').$new();
$scope.testList = [];
$scope.clickMe = function(item) {
$scope.testList.push(item);
};
$scope.item = 'test';
var markup =
'<action-list dropdown>' +
' <action button-type="split-button" callback="clickMe" item="item">' +
' View' +
' </action>' +
' <menu>' +
' <action button-type="menu-item" callback="clickMe" item="item">' +
' Edit' +
' </action>' +
' <action button-type="menu-item" callback="clickMe" item="item">' +
' Delete' +
' </action>' +
' </menu>' +
'</action-list>';
$element = angular.element(markup);
$compile($element)($scope);
$scope.$digest();
}));
it('should have one dropdown button', function() {
var dropdownButton = $element.find('.split-button');
expect(dropdownButton.length).toBe(1);
expect(dropdownButton.text().trim()).toBe('View');
});
it('should have one caret button', function() {
expect($element.find('.split-caret').length).toBe(1);
expect($element.find('.caret').length).toBe(1);
});
it('should have 2 menu items', function() {
var menuItems = $element.find('li > a');
expect(menuItems.length).toBe(2);
expect(menuItems[0].textContent.trim()).toBe('Edit');
expect(menuItems[1].textContent.trim()).toBe('Delete');
});
it('should have one item in list if "View" clicked', function() {
$element.find('.split-button').click();
expect($scope.testList.length).toBe(1);
expect($scope.testList[0]).toBe('test');
});
it('should have 3 items in list if all actions clicked', function() {
$element.find('.split-button').click();
$element.find('li > a').click();
expect($scope.testList.length).toBe(3);
});
});
describe('button group', function() {
var $scope, $element;
beforeEach(inject(function($injector) {
var $compile = $injector.get('$compile');
$scope = $injector.get('$rootScope').$new();
$scope.testList = [];
$scope.clickMe = function(item) {
$scope.testList.push(item);
};
$scope.item = 'test';
var markup = '<action-list dropdown>' +
' <action callback="clickMe" item="item">View</action>' +
' <action callback="clickMe" item="item">Edit</action>' +
' <action callback="clickMe" item="item">Delete</action>' +
'</action-list>';
$element = angular.element(markup);
$compile($element)($scope);
$scope.$digest();
}));
it('should have 3 buttons in group', function() {
var buttons = $element.find('button');
expect(buttons.length).toBe(3);
expect(buttons[0].textContent.trim()).toBe('View');
expect(buttons[1].textContent.trim()).toBe('Edit');
expect(buttons[2].textContent.trim()).toBe('Delete');
});
it('should have 3 items in list if all actions clicked', function() {
$element.find('button').click();
expect($scope.testList.length).toBe(3);
});
});
});
})();

View File

@ -1,6 +0,0 @@
<button tabIndex="0"
class="{$ disabled ? 'disabled' : '' $}"
ng-class="actionClasses"
ng-click="disabled || callback(item)">
<ng-transclude></ng-transclude>
</button>

View File

@ -1,129 +0,0 @@
(function() {
'use strict';
angular.module('hz.widget.action-list')
/**
* @ngdoc parameters
* @name hz.widget.action-list.constant:tooltipConfig
* @param {string} defaultTemplate Default warning tooltip template
* @param {string} defaultMessage Default warning tooltip message
*/
.constant('tooltipConfig', {
defaultTemplate: '<div>{$ ::message $}</div>',
defaultMessage: {
message: gettext('The action cannot be performed. The contents of this row have errors or are missing information.')
}
})
/**
* @ngdoc directive
* @name hz.widget.action-list.directive:buttonTooltip
* @element action-list
* @param {string} buttonTooltip The tooltip message
* @param {object} btModel Custom tooltip model (optional)
* @param {string} btPlacement Tooltip placement (optional)
* @param {string} btDisabled Disable the tooltip (optional)
* @description
* The `buttonTooltip` directive provides a tooltip with a general
* warning message. This directive should be added as an attribute
* to an action-list element. The content of the tooltip can be
* configured by providing a template and necessary data.
*
* Custom Tooltip Model:
* ```
* $scope.tooltipModel = {
* data: {
* message: 'My custom message',
* anotherMessage: 'Another message',
* clickMe: function() {
* alert('You clicked me');
* }
* },
* templateUrl: path + 'myWarningTooltip.html'
* }
* ```
*
* @restrict A
* @scope
*
* @example
* ```
* <action-list button-tooltip bt-model="tooltipModel">
* <action>...</action>
* </action-list>
* ```
*/
.directive('buttonTooltip',
[ 'basePath', '$compile', '$http', '$templateCache', 'tooltipConfig',
function(path, $compile, $http, $templateCache, tooltipConfig) {
return {
restrict: 'A',
scope: {
btMessage: '=buttonTooltip',
btModel: '=?',
btPlacement: '=?',
btDisabled: '=?'
},
link: function (scope, element, attrs) {
var tooltip = scope.btModel || {};
var template = tooltip.template || tooltipConfig.defaultTemplate;
if (tooltip.templateUrl) {
$http.get(tooltip.templateUrl, { cache: $templateCache })
.then(function(response) {
template = response.data;
});
}
function createTooltip() {
// If there is a custom tooltip model, use it
// Otherwise, get the message or use default message
var tooltipData = angular.extend({}, tooltip.data);
tooltipData.message = scope.btMessage || tooltipConfig.defaultMessage.message;
// Compile the template with custom tooltip model
var tooltipScope = scope.$new(true);
angular.extend(tooltipScope, tooltipData);
tooltipScope.element = element;
var compiledTemplate = $compile(template)(tooltipScope);
tooltipScope.$apply();
var options = {
content: compiledTemplate,
html: true,
placement: scope.btPlacement || 'left',
trigger: 'manual'
};
element.popover(options);
element.popover('show');
}
element.on('mousedown', function(e) {
if (!scope.btDisabled) {
var popoverElt = element.next('.popover');
if (popoverElt.length) {
element.popover('destroy');
} else {
createTooltip();
}
return false;
}
});
element.on('mouseup', function() {
if (!scope.btDisabled) {
element.find('button').first().focus();
}
});
element.on('blur', 'button', function(e) {
element.popover('destroy');
});
}
};
}
]);
})();

View File

@ -1,8 +0,0 @@
<!-- Dropdown menu item -->
<li role="presentation" ng-class="{ disabled: disabled }">
<a role="menuitem" href="#" dropdown-toggle
ng-class="actionClasses"
ng-click="disabled || callback(item)">
<ng-transclude></ng-transclude>
</a>
</li>

View File

@ -1,2 +0,0 @@
<ul role="menu" class="dropdown-menu dropdown-menu-right">
</ul>

View File

@ -1,8 +0,0 @@
<!-- Dropdown button -->
<button type="button" tabindex="0"
class="single-button dropdown-toggle {$ disabled ? 'disabled' : '' $}"
ng-class="actionClasses"
ng-click="disabled || callback(item)">
<ng-transclude></ng-transclude>
<span class="caret"></span>
</button>

View File

@ -1,15 +0,0 @@
<!-- Dropdown button -->
<button type="button" tabindex="0"
class="split-button {$ disabled ? 'disabled' : '' $}"
ng-class="actionClasses"
ng-click="disabled || callback(item)">
<ng-transclude></ng-transclude>
</button>
<!-- Dropdown caret button -->
<button class="split-caret dropdown-toggle"
ng-class="actionClasses"
ng-disabled="disabled"
aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>

View File

@ -1,4 +0,0 @@
<p>{$ ::message $}</p>
<div>
<a ng-click="expandDetail()">{$ ::clickMessage $}</a>
</div>

View File

@ -1,60 +0,0 @@
(function() {
'use strict';
/**
* @ngdoc overview
* @name hz.framework.bind-scope
* @description
*
* # hz.framework.bind-scope
*
* This utility widget supports binding the scope where the directive is
* instantiated with the transcluded content. This is useful when trying
* to display transcluded content using the `ngRepeat` scope.
*
* | Directives |
* |--------------------------------------------------------------------------|
* | {@link hz.framework.bind-scope.directive:bindScope `bindScope`} |
*
*/
angular.module('hz.framework.bind-scope', [])
/**
* @ngdoc directive
* @name hz.framework.bind-scope.directive:bindScope
* @element ng-repeat
* @description
* The `bindScope` directive injects the scope where it is
* instantiated into the transclusion function so that the
* transcluded content is rendered correctly. The content
* is then append to the element where 'bind-scope-target'
* is defined.
*
* @restrict A
*
* @example
* ```
* <tr ng-repeat bind-scope>
* <td></td>
* <td class="detail" bind-scope-target>
* </td>
* </tr>
* ```
*/
.directive('bindScope', function() {
return {
restrict: 'A',
link: function(scope, element, attrs, ctrl, transclude) {
if (transclude) {
transclude(scope, function(clone) {
var detailElt = element.find('[bind-scope-target]');
if (detailElt.length) {
detailElt.append(clone);
}
});
}
}
};
});
})();

View File

@ -1,64 +0,0 @@
(function() {
'use strict';
describe('hz.framework.bind-scope module', function() {
it('should have been defined', function() {
expect(angular.module('hz.framework.bind-scope')).toBeDefined();
});
});
describe('bind-scope directive', function() {
var $scope, $element;
beforeEach(module('hz'));
beforeEach(module('hz.widgets'));
beforeEach(module('hz.framework.bind-scope'));
beforeEach(module('hz.framework.bind-scope', function($compileProvider) {
$compileProvider.directive('testBindScope', function() {
return {
restrict: 'E',
scope: {
itemList: '='
},
transclude: true,
template: '<ul><li ng-repeat="item in itemList" bind-scope>' +
' <span bind-scope-target></span>' +
'</li></ul>'
};
});
}));
beforeEach(inject(function($injector) {
var $compile = $injector.get('$compile');
$scope = $injector.get('$rootScope').$new();
$scope.fakeData = [
{ id: '1', animal: 'cat' },
{ id: '2', animal: 'dog' },
{ id: '3', animal: 'fish' }
];
var markup = '<test-bind-scope item-list="fakeData">{$ item.animal $}</test-bind-scope>';
$element = angular.element(markup);
$compile($element)($scope);
$scope.$digest();
}));
it('should have 3 list items', function() {
expect($element.find('li').length).toBe(3);
});
it('should have 3 list items with values "cat", "dog" and "fish"', function() {
var listItems = $element.find('li');
expect(listItems[0].textContent.trim()).toBe('cat');
expect(listItems[1].textContent.trim()).toBe('dog');
expect(listItems[2].textContent.trim()).toBe('fish');
});
});
})();

View File

@ -1,9 +0,0 @@
<div class="chart-tooltip"
ng-class="{ 'tooltip-enabled': tooltip.enabled }"
ng-style="tooltip.style">
<span class="fa {$ ::tooltip.icon $}"
ng-class="tooltip.iconClass"
ng-style="{ color: tooltip.iconColor }"></span>
<span class="tooltip-key">{$ tooltip.label $}</span>
{$ tooltip.value $}
</div>

View File

@ -1,47 +0,0 @@
(function() {
'use strict';
angular.module('hz.widget.charts')
/**
* @ngdoc directive
* @name hz.widget.charts.directive:chartTooltip
* @element
* @param {object} tooltip-data The tooltip data model and styles
* @description
* The `chartTooltip` directive renders a tooltip showing a colored
* icon, label, and value.
*
* Data Model and Styles:
* ```
* var tooltipData = {
* enabled: true,
* label: 'Applied',
* value: 1,
* icon: 'fa-square',
* iconColor: '#333333',
* iconClass: 'warning',
* style: { left: '10px', top: '10px' }
* };
* ```
*
* @restrict E
* @scope tooltip: '=tooltipData'
*
* @example
* ```
* <chart-tooltip tooltip-data='tooltipData'></chart-tooltip>
* ```
*
*/
.directive('chartTooltip', [ 'basePath', function (path) {
return {
restrict: 'E',
scope: {
tooltip: '=tooltipData'
},
templateUrl: path + 'charts/chart-tooltip.html'
};
}]);
})();

View File

@ -1,25 +0,0 @@
.chart-tooltip {
background-color: $tooltip-bg-color;
border: $tooltip-border;
box-shadow: $tooltip-box-shadow;
display: none;
padding: $tooltip-padding;
position: absolute;
white-space: nowrap;
z-index: 12000;
&.tooltip-enabled {
display: inline-block;
}
.tooltip-key {
color: $tooltip-key-color;
font-weight: $tooltip-key-weight;
padding: $tooltip-key-padding;
}
i.fa {
background-color: inherit;
fill: none;
}
}

View File

@ -1,63 +0,0 @@
(function() {
'use strict';
/**
* @ngdoc overview
* @name hz.widget.charts
* @description
*
* # hz.widget.charts
*
* The `hz.widget.charts` module provides directives for simple charts
* used in Horizon, such as the pie and donut chart. Charts are
* implemented using D3.
*
* Requires {@link http://d3js.org `D3`} to be installed.
*
* | Constants |
* |-----------------------------------------------------------------|
* | {@link hz.widget.charts.constant:chartSettings `chartSettings`} |
*
* | Directives |
* |-----------------------------------------------------------------|
* | {@link hz.widget.charts.directive:pieChart `pieChart`} |
*
*/
angular.module('hz.widget.charts', [])
/**
* @ngdoc parameters
* @name hz.widget.charts.constant:chartsettings
* @param {number} innerRadius Pie chart inner radius in pixels, default: 0
* @param {number} outerRadius Pie chart outer radius in pixels, default: 35
* @param {boolean} showTitle Show title, default: true
* @param {boolean} showLabel Show label, default: true
* @param {boolean} showLegend Show legend default: true
* @param {string} tooltipIcon Tooltip key icon, default: 'fa-square'
*
*/
.constant('chartSettings', {
innerRadius: 0,
outerRadius: 35,
showTitle: true,
showLabel: true,
showLegend: true,
tooltipIcon: 'fa-square'
})
/**
* @ngdoc filter
* @name hz.widget.charts.filter:showKeyFilter
* @function Filter based on 'hideKey' value of each slice
* @returns {function} A filtered list of keys to show in legend
*
*/
.filter('showKeyFilter', function() {
return function(items) {
return items.filter(function (item) {
return !item.hideKey;
});
};
});
})();

View File

@ -1,30 +0,0 @@
<div class="pie-chart">
<chart-tooltip tooltip-data="model.tooltipData"></chart-tooltip>
<div ng-if="::model.settings.showTitle && chartData.title"
class="pie-chart-title">
{$ ::chartData.title $} ({$ model.total $} Max)
</div>
<svg class="svg-pie-chart"
ng-attr-height="{$ ::model.settings.diameter $}"
ng-attr-width="{$ ::model.settings.diameter $}">
<g class="chart"
ng-attr-transform="translate({$ ::model.settings.outerRadius $},{$ ::model.settings.outerRadius $})">
<g class="slices"></g>
<g ng-if="::model.settings.showLabel && chartData.label" class="pie-chart-label">
<text dy="0.35em" ng-style="model.settings.label">{$ chartData.label $}</text>
</g>
</g>
</svg>
<div ng-if="::model.settings.showLegend" class="pie-chart-legend">
<div ng-repeat="slice in chartData.data | showKeyFilter"
class="slice-legend">
<div class="slice-key"
ng-class="slice.colorClass"
ng-style="{ 'background-color': '{$ slice.color $}' }"></div>
{$ slice.value $} {$ slice.label $}
</div>
</div>
</div>

View File

@ -1,165 +0,0 @@
(function() {
'use strict';
angular.module('hz.widget.charts')
/**
* @ngdoc directive
* @name hz.widget.charts.directive:pieChart
* @element
* @param {object} chart-data The chart data model
* @param {string} chart-settings The custom chart settings (JSON), optional
* @description
* The `pieChart` directive renders a pie or donut chart using D3. The title
* and legend is shown by default. Each slice is represented by a label, value,
* and color (hex value or CSS class). See below for the data model.
*
* Data Model:
* ```
* var chartData = {
* title: 'Total Instances',
* label: '25%',
* data: [
* { label: 'Current', value: 1, color: '#1f83c6' },
* { label: 'Added', value: 1, color: '#81c1e7' },
* { label: 'Remaining', value: 6, colorClass: 'remaining', hideKey: true }
* ]
* };
*
* title - the chart title
* label - the text to show in center of chart
* data - the data used to render chart
*
* var chartSettings = {
* innerRadius: 35,
* outerRadius: 50,
* showLabel: false
* };
* ```
*
* @restrict E
* @scope true
*
* @example
* ```
* Pie Chart:
* <pie-chart chart-data='chartData'></pie-chart>
*
* Donut Chart:
* <pie-chart chart-data='chartData'
* chart-settings='chartSettings'></pie-chart>
* ```
*
*/
.directive('pieChart', [ 'basePath', 'chartSettings', function (path, chartSettings) {
return {
restrict: 'E',
scope: {
chartData: '=',
chartSettings: '='
},
replace: true,
templateUrl: path + 'charts/pie-chart.html',
link: function (scope, element, attrs) {
var settings = angular.extend({}, chartSettings, scope.chartSettings);
settings.diameter = settings.outerRadius * 2;
var model = {
settings: settings,
tooltipData: {
enabled: false,
icon: settings.tooltipIcon,
style: angular.extend({}, settings.tooltip)
}
};
var d3Elt = d3.select(element[0]);
var arc = d3.svg.arc()
.outerRadius(settings.outerRadius)
.innerRadius(settings.innerRadius);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
var tooltip = d3Elt.select('chart-tooltip');
var unwatch = scope.$watch('chartData', updateChart);
scope.$on('$destroy', unwatch);
scope.model = model;
function updateChart() {
scope.model.total = d3.sum(scope.chartData.data, function(d) { return d.value; });
scope.model.tooltipData.enabled = false;
// Generate or update slices
var chart = d3Elt.select('.slices')
.selectAll('path.slice')
.data(pie(scope.chartData.data));
chart.enter().append('path')
.attr('class', 'slice')
.attr('d', arc);
// Set the color or CSS class for the fill
chart.each(function(d) {
var slice = d3.select(this);
if (d.data.color) {
slice.style('fill', d.data.color);
} else if (d.data.colorClass) {
slice.classed(d.data.colorClass, true);
}
});
chart.on('mouseenter', function(d) { showTooltip(d, this); })
.on('mouseleave', clearTooltip);
// Animate the slice rendering
chart.transition()
.duration(500)
.attrTween('d', function animate(d) {
this.lastAngle = this.lastAngle || { startAngle: 0, endAngle: 0 };
var interpolate = d3.interpolate(this.lastAngle, d);
this.lastAngle = interpolate(0);
return function(t) {
return arc(interpolate(t));
};
});
chart.exit().remove();
}
function showTooltip(d, elt) {
scope.$apply(function() {
var eltHeight = element[0].getBoundingClientRect().height;
var titleHeight = element[0].querySelector('div.pie-chart-title')
.getBoundingClientRect()
.height;
var point = d3.mouse(elt);
var x = point[0] + scope.model.settings.outerRadius;
var y = eltHeight - point[1] - scope.model.settings.outerRadius - titleHeight;
scope.model.tooltipData.label = d.data.label;
scope.model.tooltipData.value = d.data.value;
scope.model.tooltipData.enabled = true;
scope.model.tooltipData.iconColor = d.data.color;
scope.model.tooltipData.iconClass = d.data.colorClass;
scope.model.tooltipData.style.left = x + 'px';
scope.model.tooltipData.style.bottom = y + 'px';
});
}
function clearTooltip() {
scope.$apply(function() {
scope.model.tooltipData.enabled = false;
});
}
}
};
}]);
})();

View File

@ -1,44 +0,0 @@
.pie-chart {
display: inline-block;
position: relative;
.svg-pie-chart {
float: left;
.slice {
cursor: pointer;
}
}
.pie-chart-title {
font-size: $chart-title-font-size;
font-weight: $chart-title-weight;
padding: $chart-title-padding;
}
.pie-chart-label {
font-size: 1.2em;
text-anchor: middle;
}
.pie-chart-legend {
float: left;
font-size: $chart-legend-font-size;
line-height: 1em;
padding: $chart-legend-padding;
.slice-legend {
padding: 0.1em 0;
.slice-key {
color: transparent;
display: inline-block;
height: 1em;
line-height: 1em;
position: relative;
top: 0.12em;
width: 0.5em;
}
}
}
}

View File

@ -1,88 +0,0 @@
/* jshint globalstrict: true */
'use strict';
describe('hz.widget.charts module', function () {
it('should be defined', function () {
expect(angular.module('hz.widget.charts')).toBeDefined();
});
});
describe('pie chart directive', function() {
var $scope, $element;
beforeEach(module('templates'));
beforeEach(module('hz'));
beforeEach(module('hz.widgets'));
beforeEach(module('hz.widget.charts'));
beforeEach(inject(function($injector) {
var $compile = $injector.get('$compile');
$scope = $injector.get('$rootScope').$new();
$scope.testData = {
title: 'Total Instances',
label: '25%',
data: [
{ label: 'Current', value: 1, color: '#1f83c6' },
{ label: 'Added', value: 1, color: '#81c1e7' },
{ label: 'Remaining', value: 6, color: '#d1d3d4', hideKey: true }
]
};
var settings = '{ "innerRadius": 25 }';
var markup = "<pie-chart chart-data='testData' chart-settings='" + settings + "'></pie-chart>";
$element = angular.element(markup);
$compile($element)($scope);
$scope.$digest();
}));
it('should be compiled', function() {
expect($element.html().trim()).not.toBe('');
});
it('should have svg element', function() {
expect($element.find('svg')).toBeDefined();
});
it('should have 3 path elements', function() {
expect($element.find('path.slice').length).toBe(3);
});
it('should have correct colors for slices', function() {
var slices = $element.find('path.slice');
var slice1Color = slices[0].style.fill;
if (slice1Color.indexOf('rgb') === 0) {
expect(slices[0].style.fill).toBe('rgb(31, 131, 198)');
expect(slices[1].style.fill).toBe('rgb(129, 193, 231)');
expect(slices[2].style.fill).toBe('rgb(209, 211, 212)');
} else {
expect(slices[0].style.fill).toBe('#1f83c6');
expect(slices[1].style.fill).toBe('#81c1e7');
expect(slices[2].style.fill).toBe('#d1d3d4');
}
});
it('should have a correct title "Total Instances (8 Max)"', function() {
var title = $element.find('.pie-chart-title').text().trim();
expect(title).toBe('Total Instances (8 Max)');
});
it('should have a legend', function() {
expect($element.find('.pie-chart-legend')).toBeDefined();
});
it ('should have correct legend keys and labels', function() {
var legendKeys = $element.find('.pie-chart-legend .slice-legend');
var firstKeyLabel = legendKeys[0];
var secondKeyLabel = legendKeys[1];
expect(firstKeyLabel.textContent.trim()).toBe('1 Current');
expect(secondKeyLabel.textContent.trim()).toBe('1 Added');
});
});

View File

@ -1,71 +0,0 @@
(function() {
'use strict';
/**
* @ngdoc overview
* @name hz.widget.form
*
* # hz.widget.form
*
* The `hz.widget.form` provides form directives and services.
*
* | Components |
* |----------------------------------------------------------|
* | {@link hz.widget.form.hzPasswordMatch `hzPasswordMatch`} |
*
*/
var app = angular.module('hz.widget.form', []);
/**
* @ngdoc directive
* @name hzPasswordMatch
*
* @description
* A directive to ensure that password matches.
* Changing the password or confirmation password triggers a validation check.
* However, only the confirmation password will show an error if match is false.
* The goal is to check that confirmation password matches the password,
* not whether the password matches the confirmation password.
* The behavior here is NOT bi-directional.
*
* @requires
* ng-model - model for confirmation password
*
* @scope
* hzPasswordMatch - form model to validate against
*
* @example:
* <form name="form">
* <input type='password' id="psw" ng-model="user.psw" name="psw">
* <input type='password' ng-model="user.cnf" hz-password-match="form.psw">
* </form>
*
* Note that id and name are required for the password input.
* This directive uses the form model and id for validation check.
*/
app.directive('hzPasswordMatch', function(){
return {
restrict: 'A',
require: 'ngModel',
scope: { pw: '=hzPasswordMatch' },
link: function(scope, element, attr, ctrl){
// helper function to check that password matches
function passwordCheck(){
scope.$apply(function(){
var match = (ctrl.$modelValue === scope.pw.$modelValue);
ctrl.$setValidity('match', match);
});
}
// this ensures that typing in either input
// will trigger the password match
var pwElement = $('#'+scope.pw.$name);
pwElement.on('keyup change', passwordCheck);
element.on('keyup change', passwordCheck);
} // end of link
}; // end of return
}); // end of directive
})();

View File

@ -1,93 +0,0 @@
/* jshint globalstrict: true */
'use strict';
describe('hz.widget.form module', function(){
it('should have been defined', function(){
expect(angular.module('hz.widget.form')).toBeDefined();
});
});
describe('form directives', function() {
beforeEach(module('hz'));
beforeEach(module('hz.widgets'));
beforeEach(module('hz.widget.form'));
describe('hzPasswordMatch directive', function() {
var $compile, $rootScope;
var element, password, cpassword;
var markup =
'<form name="form">' +
'<input type="password" ng-model="user.password" name="password">' +
'<input type="password" ng-model="user.cpassword" ' +
'hz-password-match="form.password">' +
'</form>';
beforeEach(inject(function($injector){
$compile = $injector.get('$compile');
$rootScope = $injector.get('$rootScope').$new();
// generate dom from markup
element = $compile(markup)($rootScope);
password = element.children('input[name]');
cpassword = element.children('input[hz-password-match]');
// setup up initial data
$rootScope.user = {};
$rootScope.$digest();
}));
it('should be initially empty', function() {
expect(password.val()).toEqual('');
expect(password.val()).toEqual(cpassword.val());
expect(cpassword.hasClass('ng-valid')).toBe(true);
});
it('should not match if user changes only password', function(done) {
$rootScope.user.password = 'password';
$rootScope.$digest();
cpassword.change();
setTimeout(function(){
expect(cpassword.val()).not.toEqual(password.val());
expect(cpassword.hasClass('ng-invalid')).toBe(true);
done();
}, 1000);
});
it('should not match if user changes only confirmation password', function(done) {
$rootScope.user.cpassword = 'password';
$rootScope.$digest();
cpassword.change();
setTimeout(function(){
expect(cpassword.val()).not.toEqual(password.val());
expect(cpassword.hasClass('ng-invalid')).toBe(true);
done();
}, 1000);
});
it('should match if both passwords are the same', function(done) {
$rootScope.user.password = 'password';
$rootScope.user.cpassword = 'password';
$rootScope.$digest();
cpassword.change();
setTimeout(function(){
expect(cpassword.val()).toEqual(password.val());
expect(cpassword.hasClass('ng-valid')).toBe(true);
done();
}, 1000);
});
it('should not match if both passwords are different', function(done) {
$rootScope.user.password = 'password123';
$rootScope.user.cpassword = 'password345';
$rootScope.$digest();
cpassword.change();
setTimeout(function(){
expect(cpassword.val()).not.toEqual(password.val());
expect(cpassword.hasClass('ng-invalid')).toBe(true);
done();
}, 1000);
});
}); // end of hzPasswordMatch directive
}); // end of form directives

View File

@ -1,5 +0,0 @@
<div class="help-panel" ng-class="{'open': openHelp}">
<button class="open" ng-click="openHelp=true"><span class="fa fa-question-circle"></span></button>
<button class="close" ng-click="openHelp=false"><span class="fa fa-times-circle"></span></button>
<div class="content" ng-transclude></div>
</div>

View File

@ -1,13 +0,0 @@
(function () {
'use strict';
angular.module('hz.widget.help-panel', [])
.directive('helpPanel', ['basePath',
function (path) {
return {
templateUrl: path + 'help-panel/help-panel.html',
transclude: true
};
}
]);
})();

View File

@ -1,86 +0,0 @@
.help-panel {
position: absolute;
width: $helpPanelWidthDefault;
right: -$helpPanelWidthDefault;
top: 0;
bottom: 0;
color: $helpPanelColor;
background: $helpPanelBg;
-webkit-transition: right linear 0.1s;
transition: right linear 0.1s;
z-index: 10;
.content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
padding: 10px 20px;
overflow-y: auto;
h1 {
font-size: 20px;
line-height: 1.8;
margin: 0;
}
li {
list-style-position: inside;
}
p {
line-height: 1.4;
margin: 1em 0;
}
}
&.open {
right: 0;
border: 1px solid $helpPanelBorderColor;
border-right: none;
margin-top: -1px;
margin-bottom: -1px;
& > button.open {
display: none;
}
& > button.close {
display: block;
opacity: 1; // override bootstrap
font-size: 14px; // override bootstrap
}
}
& > button {
position: absolute;
top: 0;
left: -$helpPanelBtnSize;
width: $helpPanelBtnSize;
height: $helpPanelBtnSize;
line-height: $helpPanelBtnSize;
padding: 0;
border: none;
text-align: center;
vertical-align: middle;
background: $helpPanelBtnBg;
border: 1px solid $helpPanelBorderColor;
border-right: none;
margin-top: -1px;
// button icon
& > * {
display: inline-block;
vertical-align: middle;
background: $helpPanelBtnIconBg;
color: $helpPanelBtnIconColor;
font-size: $helpPanelBtnIconSize;
}
&.close {
display: none;
}
}
}

View File

@ -1,48 +0,0 @@
/* jshint globalstrict: true */
'use strict';
describe('hz.widget.help-panel module', function() {
it('should have been defined', function () {
expect(angular.module('hz.widget.help-panel')).toBeDefined();
});
});
describe('help-panel directive', function () {
var $compile,
$scope,
element;
beforeEach(module('templates'));
beforeEach(module('hz'));
beforeEach(module('hz.widgets'));
beforeEach(module('hz.widget.help-panel'));
beforeEach(inject(function ($injector) {
$scope = $injector.get('$rootScope').$new();
$compile = $injector.get('$compile');
element = $compile('<help-panel>Help</help-panel>')($scope);
$scope.$digest();
}));
it('should be compiled', function () {
expect(element.html().trim()).not.toBe('Help');
expect(element.text().trim()).toBe('Help');
});
it('should be closed by default', function () {
expect(element[0].querySelector('.help-panel').className).toBe('help-panel');
});
it('should add "open" to class name if $scope.openHelp===true', function () {
$scope.openHelp = true;
$scope.$digest();
expect(element[0].querySelector('.help-panel').className).toBe('help-panel open');
});
it('should remove "open" from class name if $scope.openHelp===false', function () {
$scope.openHelp = true;
$scope.$digest();
$scope.openHelp = false;
$scope.$digest();
expect(element[0].querySelector('.help-panel').className).toBe('help-panel');
});
});

View File

@ -1,104 +0,0 @@
/**
* Copyright 2015 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
(function() {
'use strict';
angular.module('hz')
/**
* @ngdoc hzLoginCtrl
* @description
* controller for determining which
* authentication method user picked.
*/
.controller('hzLoginCtrl', function($scope) {
$scope.auth_type = 'credentials';
})
/**
* @ngdoc hzLoginFinder
* @description
* A directive to show or hide inputs and help text
* based on which authentication method the user selected.
* Since HTML is generated server-side via Django form,
* this directive is the hook to make it more dynamic.
* Only visible if websso is enabled.
*/
.directive('hzLoginFinder', function($timeout) {
return {
restrict: 'A',
link: function(scope, element) {
// test code does not have access to document
// so we are restricted to search through the element
var authType = element.find('#id_auth_type');
var userInput = element.find("#id_username").parents('.form-group');
var passwordInput = element.find("#id_password").parents('.form-group');
var domainInput = element.find('#id_domain').parents('form-group');
var regionInput = element.find('#id_region').parents('form-group');
// helptext exists outside of element
// we have to traverse one node up
var helpText = element.parent().find('#help_text');
helpText.hide();
// update the visuals
// when user selects item from dropdown
function onChange(e) {
$timeout(function() {
// if type is credential
// show the username and password fields
// and domain and region if applicable
scope.auth_type = authType.val();
switch(scope.auth_type) {
case 'credentials':
userInput.show();
passwordInput.show();
domainInput.show();
regionInput.show();
break;
default:
userInput.hide();
passwordInput.hide();
domainInput.hide();
regionInput.hide();
}
}); // end of timeout
} // end of onChange
// if authType field exists
// then websso was enabled
if (authType.length > 0) {
// programmatically insert help text after dropdown
// this is the only way to do it since template is
// generated server side via form_fields
authType.after(helpText);
helpText.show();
// trigger the onChange on first load
// so that initial choice is auto-selected
onChange();
authType.change(onChange);
}
} // end of link
}; // end of return
}); // end of directive
})();

View File

@ -1,166 +0,0 @@
/**
* Copyright 2015 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
/* jshint globalstrict: true */
'use strict';
describe('hzLoginCtrl', function(){
var $controller;
beforeEach(module('hz'));
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('$scope.auth_type', function(){
it('should initialize to credentials', function(){
var scope = {};
var controller = $controller('hzLoginCtrl', { $scope: scope });
expect(scope.auth_type).toEqual('credentials');
});
});
});
describe('hzLoginFinder', function(){
var $compile, $rootScope, $timeout;
var websso_markup =
'<form>' +
'<p id="help_text">Some help text.</p>' +
'<fieldset hz-login-finder>' +
'<div>' +
'<select id="id_auth_type">' +
'<option value="credentials">Credentials</option>' +
'<option value="oidc">OpenID Connect</option>' +
'</select>' +
'</div>' +
'<div class="form-group"><input id="id_username"></div>' +
'<div class="form-group"><input id="id_password"></div>' +
'</fieldset>' +
'</form>';
var regular_markup =
'<form>' +
'<p id="help_text">Some help text.</p>' +
'<fieldset hz-login-finder>' +
'<div class="form-group"><input id="id_username"></div>' +
'<div class="form-group"><input id="id_password"></div>' +
'</fieldset>' +
'</form>';
beforeEach(module('hz'));
beforeEach(inject(function(_$compile_, _$rootScope_, _$timeout_){
$compile = _$compile_;
$rootScope = _$rootScope_;
$timeout = _$timeout_;
jasmine.addMatchers({
// jquery show is not consistent across different browsers
// on FF, it is 'block' while on chrome it is 'inline'
// to reconcile this difference, we need a custom matcher
toBeVisible: function(){
return {
compare: function(actual){
var pass = (actual.css('display') !== 'none');
var result = {
pass: pass,
message: pass?
'Expected element to be visible':
'Expected element to be visible, but it is hidden'
};
return result;
}
};
}
});
}));
describe('when websso is not enabled', function(){
var element,
helpText, authType,
userInput, passwordInput;
beforeEach(function(){
element = $compile(regular_markup)($rootScope);
authType = element.find('#id_auth_type');
userInput = element.find("#id_username").parents('.form-group');
passwordInput = element.find("#id_password").parents('.form-group');
helpText = element.find('#help_text');
$rootScope.$digest();
});
it('should not contain auth_type select input', function(){
expect(authType.length).toEqual(0);
});
it('should hide help text', function(){
expect(helpText).not.toBeVisible();
});
it('should show username and password inputs', function(){
expect(userInput).toBeVisible();
expect(passwordInput).toBeVisible();
});
});
describe('when websso is enabled', function(){
var element,
helpText, authType,
userInput, passwordInput;
beforeEach(function(){
element = $compile(websso_markup)($rootScope);
authType = element.find('#id_auth_type');
userInput = element.find("#id_username").parents('.form-group');
passwordInput = element.find("#id_password").parents('.form-group');
helpText = element.find('#help_text');
$rootScope.$digest();
});
it('should contain auth_type select input', function(){
expect(authType.length).toEqual(1);
});
it('should show help text below auth_type', function(){
expect(authType.next().get(0)).toEqual(helpText.get(0));
});
it('should show help text', function(){
expect(helpText).toBeVisible();
});
it('should show username and password inputs', function(){
expect(userInput).toBeVisible();
expect(passwordInput).toBeVisible();
});
it('should hide username and password when user picks oidc', function(){
authType.val('oidc');
authType.change();
$timeout.flush();
expect(userInput).not.toBeVisible();
expect(passwordInput).not.toBeVisible();
});
});
});

View File

@ -1,50 +0,0 @@
<!--! Magic Searchbar -->
<div class="magic-search" magic-overrides>
<div class="search-bar">
<i class="fi-filter fa fa-filter go"></i>
<div class="search-main-area">
<span class="item-list">
<span class="label radius secondary item"
ng-repeat="facet in currentSearch" ng-cloak="cloak">
<span>
{$ facet.label[0] $}:<b>{$ facet.label[1] $}</b>
</span>
<a class="remove" ng-click="removeFacet($index, $event)" title="{$ strings.remove $}">
<i class="fi-x fa fa-times"></i>
</a>
</span>
</span>
<span class="search-selected label" ng-cloak="" ng-show="facetSelected">
{$ facetSelected.label[0] $}:
</span>
<!-- For bootstrap, the dropdown attribute is moved from input up to div. -->
<div class="search-entry" dropdown is-open="isMenuOpen">
<input class="search-input" type="text" dropdown-toggle
placeholder="{$ strings.prompt $}" autocomplete="off" />
<ul id="facet-drop" class="f-dropdown dropdown-menu" data-dropdown-content="">
<li ng-repeat="facet in filteredObj" ng-show="!facetSelected">
<a ng-click="facetClicked($index, $event, facet.name)"
ng-show="!isMatchLabel(facet.label)">{$ facet.label $}</a>
<a ng-click="facetClicked($index, $event, facet.name)"
ng-show="isMatchLabel(facet.label)">
{$ facet.label[0] $}<span class="match">{$ facet.label[1] $}</span>{$ facet.label[2] $}
</a>
</li>
<li ng-repeat="option in filteredOptions" ng-show="facetSelected">
<a ng-click="optionClicked($index, $event, option.key)"
ng-show="!isMatchLabel(option.label)">
{$ option.label $}
</a>
<a ng-click="optionClicked($index, $event, option.key)"
ng-show="isMatchLabel(option.label)">
{$ option.label[0] $}<span class="match">{$ option.label[1] $}</span>{$ option.label[2] $}
</a>
</li>
</ul>
</div>
</div>
<a ng-click="clearSearch()" ng-show="currentSearch.length &gt; 0" title="{$ strings.cancel $}">
<i class="fi-x fa fa-times cancel"></i>
</a>
</div>
</div>

View File

@ -1,35 +0,0 @@
(function() {
'use strict';
angular.module('MagicSearch', ['ui.bootstrap'])
.directive('magicOverrides', function() {
return {
restrict: 'A',
controller: ['$scope', '$timeout',
function($scope, $timeout) {
// showMenu and hideMenu depend on foundation's dropdown. They need
// to be modified to work with another dropdown implemenation.
// For bootstrap, they are not needed at all.
$scope.showMenu = function() {
$timeout(function() {
$scope.isMenuOpen = true;
});
};
$scope.hideMenu = function() {
$timeout(function() {
$scope.isMenuOpen = false;
});
};
$scope.isMenuOpen = false;
// magic_search.js should absorb this code?
$scope.$on('facetsChanged', function() {
$timeout(function() {
$scope.currentSearch = [];
$scope.initSearch();
});
});
}
]
}; // end of return
}); // end of directive
})();

Some files were not shown because too many files have changed in this diff Show More