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:
parent
2c63adb20a
commit
c490b9ec1b
@ -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>
|
@ -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
@ -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
|
@ -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.
|
||||
|
@ -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
|
@ -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
|
@ -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
|
@ -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",
|
||||
]
|
@ -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()
|
@ -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
|
@ -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)
|
@ -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)
|
@ -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
|
@ -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()
|
@ -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 }})
|
@ -1 +0,0 @@
|
||||
/* Additional CSS for {{ dash_name }}. */
|
@ -1 +0,0 @@
|
||||
/* Additional JavaScript for {{ dash_name }}. */
|
@ -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 %}
|
@ -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
|
||||
}
|
@ -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 %}
|
@ -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 %}
|
@ -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)
|
@ -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'),
|
||||
)
|
@ -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
|
@ -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
|
@ -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',
|
||||
}
|
@ -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
|
@ -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)
|
@ -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',
|
||||
]
|
@ -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"
|
@ -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
|
@ -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)
|
@ -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()
|
@ -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 "« Prev"
|
||||
msgstr "« Zurück"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Weiter »"
|
||||
|
||||
#: 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."
|
@ -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."
|
@ -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 "« Prev"
|
||||
msgstr ""
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
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 ""
|
@ -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 ""
|
@ -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 "« Prev"
|
||||
msgstr "« Prev"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Next »"
|
||||
|
||||
#: 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."
|
@ -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."
|
@ -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 "« Prev"
|
||||
msgstr "« Prev"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Next »"
|
||||
|
||||
#: 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."
|
@ -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."
|
@ -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 "« Prev"
|
||||
msgstr "« Prev"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Siguiente »"
|
||||
|
||||
#: 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."
|
@ -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."
|
@ -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 d’accueil</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 "« Prev"
|
||||
msgstr "« Aperçu"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Suivant »"
|
||||
|
||||
#: 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é."
|
@ -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."
|
@ -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 "« Prev"
|
||||
msgstr "« 前へ"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
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 "%(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 が完了しませんでした。"
|
@ -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 "パスワードが一致しません。"
|
@ -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 "« Prev"
|
||||
msgstr "« 이전"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
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 "%(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가 완료되지 않았습니다."
|
@ -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 "비밀번호가 일치하지 않습니다."
|
@ -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 "« Prev"
|
||||
msgstr "« Poprzednie"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Następne »"
|
||||
|
||||
#: 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."
|
@ -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ą"
|
@ -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 "« Prev"
|
||||
msgstr "« Prev"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
msgstr "Next »"
|
||||
|
||||
#: 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."
|
@ -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."
|
@ -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 "« Prev"
|
||||
msgstr "« Предыдущее"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
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 "%(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 не завершено."
|
@ -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 "Пароли не совпадают."
|
@ -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 "« Prev"
|
||||
msgstr "« 前页"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
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 "%(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 没有完成。"
|
@ -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 "密码不匹配。"
|
@ -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 "« Prev"
|
||||
msgstr "« 上一頁"
|
||||
|
||||
#: templates/horizon/common/_data_table.html:80
|
||||
msgid "Next »"
|
||||
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 "%(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。"
|
@ -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 "密碼沒有相配。"
|
@ -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])
|
@ -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])
|
@ -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)
|
@ -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
|
@ -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))
|
@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
||||
|
||||
}());
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
})();
|
@ -1,6 +0,0 @@
|
||||
<button tabIndex="0"
|
||||
class="{$ disabled ? 'disabled' : '' $}"
|
||||
ng-class="actionClasses"
|
||||
ng-click="disabled || callback(item)">
|
||||
<ng-transclude></ng-transclude>
|
||||
</button>
|
@ -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');
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
||||
|
||||
})();
|
@ -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>
|
@ -1,2 +0,0 @@
|
||||
<ul role="menu" class="dropdown-menu dropdown-menu-right">
|
||||
</ul>
|
@ -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>
|
@ -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>
|
@ -1,4 +0,0 @@
|
||||
<p>{$ ::message $}</p>
|
||||
<div>
|
||||
<a ng-click="expandDetail()">{$ ::clickMessage $}</a>
|
||||
</div>
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
})();
|
@ -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');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
})();
|
@ -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>
|
@ -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'
|
||||
};
|
||||
}]);
|
||||
|
||||
})();
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
})();
|
@ -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>
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
}]);
|
||||
|
||||
})();
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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');
|
||||
});
|
||||
|
||||
});
|
71
code/horizon/horizon/static/angular/form/form.js
vendored
71
code/horizon/horizon/static/angular/form/form.js
vendored
@ -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
|
||||
|
||||
})();
|
@ -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
|
@ -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>
|
@ -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
|
||||
};
|
||||
}
|
||||
]);
|
||||
})();
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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');
|
||||
});
|
||||
});
|
104
code/horizon/horizon/static/angular/login/login.js
vendored
104
code/horizon/horizon/static/angular/login/login.js
vendored
@ -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
|
||||
|
||||
})();
|
@ -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();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
@ -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 > 0" title="{$ strings.cancel $}">
|
||||
<i class="fi-x fa fa-times cancel"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
@ -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
Loading…
Reference in New Issue
Block a user