freshrss.pot 139 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040
  1. # SOME DESCRIPTIVE TITLE
  2. # Copyright (C) YEAR Free Software Foundation, Inc.
  3. # This file is distributed under the same license as the PACKAGE package.
  4. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5. #
  6. #, fuzzy
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: PACKAGE VERSION\n"
  10. "Report-Msgid-Bugs-To: https://github.com/FreshRSS/FreshRSS/issues\n"
  11. "POT-Creation-Date: 2019-12-29 11:00+0100\n"
  12. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  13. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14. "Language-Team: LANGUAGE <LL@li.org>\n"
  15. "Language: \n"
  16. "MIME-Version: 1.0\n"
  17. "Content-Type: text/plain; charset=UTF-8\n"
  18. "Content-Transfer-Encoding: 8bit\n"
  19. #. type: Title ##
  20. #: en/./contributing.md:1
  21. #, no-wrap
  22. msgid "Join us on the mailing lists"
  23. msgstr ""
  24. #. type: Plain text
  25. #: en/./contributing.md:4
  26. msgid ""
  27. "Do you want to ask us some questions? Do you want to discuss with us? Don't "
  28. "hesitate to subscribe to our mailing lists!"
  29. msgstr ""
  30. #. type: Bullet: '* '
  31. #: en/./contributing.md:7
  32. msgid ""
  33. "The first mailing is destined to generic information, it should be adapted "
  34. "to users. [Join "
  35. "mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing)."
  36. msgstr ""
  37. #. type: Bullet: '* '
  38. #: en/./contributing.md:7
  39. msgid ""
  40. "The second mailing is mainly for developers. [Join "
  41. "dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)"
  42. msgstr ""
  43. #. type: Title ##
  44. #: en/./contributing.md:8
  45. #, no-wrap
  46. msgid "Report a bug"
  47. msgstr ""
  48. #. type: Plain text
  49. #: en/./contributing.md:11
  50. msgid ""
  51. "Have you found a bug? Don't panic, here are some steps to report it with "
  52. "ease:"
  53. msgstr ""
  54. #. type: Bullet: '1. '
  55. #: en/./contributing.md:15
  56. msgid ""
  57. "Search for it on [the bug "
  58. "tracker](https://github.com/FreshRSS/FreshRSS/issues) (don't forget to use "
  59. "the search bar)."
  60. msgstr ""
  61. #. type: Bullet: '2. '
  62. #: en/./contributing.md:15
  63. msgid ""
  64. "If you find a similar bug, don't hesitate to post a comment to add more "
  65. "importance to the related ticket."
  66. msgstr ""
  67. #. type: Bullet: '3. '
  68. #: en/./contributing.md:15
  69. msgid ""
  70. "If you didn't find it, [open a new "
  71. "ticket](https://github.com/FreshRSS/FreshRSS/issues/new)."
  72. msgstr ""
  73. #. type: Plain text
  74. #: en/./contributing.md:17
  75. msgid ""
  76. "If you have to create a new ticket, please try to keep in mind the following "
  77. "advice:"
  78. msgstr ""
  79. #. type: Bullet: '* '
  80. #: en/./contributing.md:20
  81. msgid "Give an explicit title to the ticket so it will be easier to find it later."
  82. msgstr ""
  83. #. type: Bullet: '* '
  84. #: en/./contributing.md:20
  85. msgid ""
  86. "Be as exhaustive as possible in the description: what did you do? What is "
  87. "the bug? What are the steps to reproduce the bug?"
  88. msgstr ""
  89. #. type: Plain text
  90. #: en/./contributing.md:22
  91. msgid "We also need some information:"
  92. msgstr ""
  93. #. type: Bullet: '* '
  94. #: en/./contributing.md:27
  95. msgid "Your FreshRSS version (on the about page or in the `constants.php` file)"
  96. msgstr ""
  97. #. type: Bullet: '* '
  98. #: en/./contributing.md:27
  99. msgid "Your server configuration: the type of hosting and the PHP version"
  100. msgstr ""
  101. #. type: Bullet: '* '
  102. #: en/./contributing.md:27
  103. msgid "Your storage system (SQLite, MySQL, MariaDB, PostgreSQL)"
  104. msgstr ""
  105. #. type: Bullet: '* '
  106. #: en/./contributing.md:27
  107. msgid ""
  108. "If possible, the related logs (PHP logs and FreshRSS logs under "
  109. "`data/users/your_user/log.txt`)"
  110. msgstr ""
  111. #. type: Title ##
  112. #: en/./contributing.md:28
  113. #, no-wrap
  114. msgid "Fix a bug"
  115. msgstr ""
  116. #. type: Plain text
  117. #: en/./contributing.md:31
  118. msgid ""
  119. "Would you like to fix a bug? For optimum coordination between collaborators, "
  120. "you should follow these indications:"
  121. msgstr ""
  122. #. type: Bullet: '1. '
  123. #: en/./contributing.md:36
  124. msgid ""
  125. "Be sure the bug is associated with a ticket and indicate that you'll work on "
  126. "it."
  127. msgstr ""
  128. #. type: Bullet: '2. '
  129. #: en/./contributing.md:36
  130. msgid ""
  131. "[Fork the project "
  132. "repository](https://help.github.com/articles/fork-a-repo/)."
  133. msgstr ""
  134. #. type: Bullet: '3. '
  135. #: en/./contributing.md:36
  136. msgid ""
  137. "[Create a new "
  138. "branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). "
  139. "The name of the branch should be clear, and ideally prefixed by the related "
  140. "ticket id. For instance, `783-contributing-file` to fix [ticket "
  141. "#783](https://github.com/FreshRSS/FreshRSS/issues/783)."
  142. msgstr ""
  143. #. type: Bullet: '4. '
  144. #: en/./contributing.md:36
  145. msgid ""
  146. "Make your changes to your fork and [send a pull "
  147. "request](https://help.github.com/articles/using-pull-requests/)."
  148. msgstr ""
  149. #. type: Plain text
  150. #: en/./contributing.md:38
  151. msgid ""
  152. "If you have to write code, please follow [our coding style "
  153. "recommendations](developers/01_First_steps.md)."
  154. msgstr ""
  155. #. type: Plain text
  156. #: en/./contributing.md:40
  157. #, no-wrap
  158. msgid ""
  159. "**Tip:** if you're searching for easy-to-fix bugs, please have a look at the "
  160. "\"[good first "
  161. "issue](https://github.com/FreshRSS/FreshRSS/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\" "
  162. "ticket label.\n"
  163. msgstr ""
  164. #. type: Title ##
  165. #: en/./contributing.md:41
  166. #, no-wrap
  167. msgid "Submit an idea"
  168. msgstr ""
  169. #. type: Plain text
  170. #: en/./contributing.md:44
  171. msgid ""
  172. "You have great ideas, yes! Don't be shy and open [a new "
  173. "ticket](https://github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker "
  174. "to ask if we can implement it. The greatest ideas often come from the shyest "
  175. "suggestions!"
  176. msgstr ""
  177. #. type: Plain text
  178. #: en/./contributing.md:46
  179. msgid "If your idea is nice, we'll have a look at it."
  180. msgstr ""
  181. #. type: Title ##
  182. #: en/./contributing.md:47
  183. #, no-wrap
  184. msgid "Contribute to internationalization (i18n)"
  185. msgstr ""
  186. #. type: Plain text
  187. #: en/./contributing.md:50
  188. msgid ""
  189. "If you want to improve internationalization, please open a new ticket first "
  190. "and follow the advice from the *Fix a bug* section."
  191. msgstr ""
  192. #. type: Plain text
  193. #: en/./contributing.md:52
  194. msgid "Translations are present in the subdirectories of `./app/i18n/`."
  195. msgstr ""
  196. #. type: Plain text
  197. #: en/./contributing.md:54
  198. msgid ""
  199. "We're working on a better way to handle internationalization, but don't "
  200. "hesitate to suggest any ideas!"
  201. msgstr ""
  202. #. type: Title ##
  203. #: en/./contributing.md:55
  204. #, no-wrap
  205. msgid "Contribute to documentation"
  206. msgstr ""
  207. #. type: Plain text
  208. #: en/./contributing.md:58
  209. msgid ""
  210. "The documentation needs a lot of improvements in order to be more useful to "
  211. "new contributors and we are working on it. If you want to give some help, "
  212. "meet us in the main repositories [docs "
  213. "directory](https://github.com/FreshRSS/FreshRSS/tree/master/docs)!"
  214. msgstr ""
  215. #. type: Title #
  216. #: en/./developers/01_First_steps.md:1
  217. #, no-wrap
  218. msgid "Environment configuration (Docker)"
  219. msgstr ""
  220. #. type: Plain text
  221. #: en/./developers/01_First_steps.md:4
  222. msgid ""
  223. "FreshRSS is built with PHP and uses a homemade framework, Minz. The "
  224. "dependencies are directly included in the source code, so you don't need "
  225. "Composer."
  226. msgstr ""
  227. #. type: Plain text
  228. #: en/./developers/01_First_steps.md:6
  229. msgid ""
  230. "There are various ways to configure your development environment. The "
  231. "easiest and most supported method is based on Docker, which is the solution "
  232. "documented below. If you already have a working PHP environment, you "
  233. "probably don't need it."
  234. msgstr ""
  235. #. type: Plain text
  236. #: en/./developers/01_First_steps.md:8
  237. msgid ""
  238. "We assume here that you use a GNU/Linux distribution, capable of running "
  239. "Docker. Otherwise, you'll have to adapt the commands accordingly."
  240. msgstr ""
  241. #. type: Plain text
  242. #: en/./developers/01_First_steps.md:10
  243. msgid ""
  244. "The commands that follow have to be executed in a console. They start by `$` "
  245. "when commands need to be executed as normal user, and by `#` when they need "
  246. "to be executed as root user. You don't have to type these characters. A path "
  247. "may be indicated before these characters to help you identify where they "
  248. "need to be executed. For instance, `app$ echo 'Hello World'` indicates that "
  249. "you have to execute `echo` command in the `app/` directory."
  250. msgstr ""
  251. #. type: Plain text
  252. #: en/./developers/01_First_steps.md:12
  253. msgid ""
  254. "First, you need to install "
  255. "[Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/)."
  256. msgstr ""
  257. #. type: Plain text
  258. #: en/./developers/01_First_steps.md:14
  259. msgid "Once you're done, clone the repository with:"
  260. msgstr ""
  261. #. type: Code fence info string
  262. #: en/./developers/01_First_steps.md:15 en/./developers/01_First_steps.md:24 en/./developers/01_First_steps.md:34 en/./developers/01_First_steps.md:42 en/./developers/01_First_steps.md:50 en/./developers/03_Running_tests.md:9 en/./developers/03_Running_tests.md:17
  263. #, no-wrap
  264. msgid "console"
  265. msgstr ""
  266. #. type: Plain text
  267. #: en/./developers/01_First_steps.md:15
  268. #, no-wrap
  269. msgid ""
  270. "$ git clone https://github.com/FreshRSS/FreshRSS.git\n"
  271. "$ cd FreshRSS\n"
  272. msgstr ""
  273. #. type: Plain text
  274. #: en/./developers/01_First_steps.md:21
  275. msgid ""
  276. "Note that, if you want to contribute, you have to fork the repository first "
  277. "and clone your fork instead of the \"root\" one. Adapt the commands in "
  278. "consequence."
  279. msgstr ""
  280. #. type: Plain text
  281. #: en/./developers/01_First_steps.md:23
  282. msgid "Then, the only command you need to know is the following:"
  283. msgstr ""
  284. #. type: Plain text
  285. #: en/./developers/01_First_steps.md:24
  286. #, no-wrap
  287. msgid "$ make start\n"
  288. msgstr ""
  289. #. type: Plain text
  290. #: en/./developers/01_First_steps.md:29
  291. msgid ""
  292. "This might take some time while Docker downloads the image. If your user "
  293. "isn't in the `docker` group, you'll need to prepend the command with `sudo`."
  294. msgstr ""
  295. #. type: Plain text
  296. #: en/./developers/01_First_steps.md:31
  297. #, no-wrap
  298. msgid ""
  299. "**You can now access FreshRSS at "
  300. "[http://localhost:8080](http://localhost:8080).** Just follow the install "
  301. "process and select the SQLite database.\n"
  302. msgstr ""
  303. #. type: Plain text
  304. #: en/./developers/01_First_steps.md:33
  305. #, no-wrap
  306. msgid ""
  307. "You can stop the containers by typing <kbd>Control</kbd> + <kbd>c</kbd> or "
  308. "with the following command, in another terminal:\n"
  309. msgstr ""
  310. #. type: Plain text
  311. #: en/./developers/01_First_steps.md:34
  312. #, no-wrap
  313. msgid "$ make stop\n"
  314. msgstr ""
  315. #. type: Plain text
  316. #: en/./developers/01_First_steps.md:39
  317. msgid ""
  318. "If you're interested in the configuration, the `make` commands are defined "
  319. "in the [`Makefile`](/Makefile)."
  320. msgstr ""
  321. #. type: Plain text
  322. #: en/./developers/01_First_steps.md:41
  323. msgid ""
  324. "If you need to use a different tag image (default is `alpine`), you can set "
  325. "the `TAG` environment variable:"
  326. msgstr ""
  327. #. type: Plain text
  328. #: en/./developers/01_First_steps.md:42
  329. #, no-wrap
  330. msgid "$ TAG=arm make start\n"
  331. msgstr ""
  332. #. type: Plain text
  333. #: en/./developers/01_First_steps.md:47
  334. msgid ""
  335. "You can find the full list of available tags [on the Docker "
  336. "hub](https://hub.docker.com/r/freshrss/freshrss/tags)."
  337. msgstr ""
  338. #. type: Plain text
  339. #: en/./developers/01_First_steps.md:49
  340. msgid ""
  341. "If you want to build the Docker image yourself, you can use the following "
  342. "command:"
  343. msgstr ""
  344. #. type: Plain text
  345. #: en/./developers/01_First_steps.md:50
  346. #, no-wrap
  347. msgid ""
  348. "$ make build\n"
  349. "$ # or\n"
  350. "$ TAG=arm make build\n"
  351. msgstr ""
  352. #. type: Plain text
  353. #: en/./developers/01_First_steps.md:57
  354. msgid ""
  355. "The `TAG` variable can be anything (e.g. `local`). You can target a specific "
  356. "architecture by adding `-alpine` or `-arm` at the end of the tag "
  357. "(e.g. `local-arm`)."
  358. msgstr ""
  359. #. type: Title #
  360. #: en/./developers/01_First_steps.md:58
  361. #, no-wrap
  362. msgid "Project architecture"
  363. msgstr ""
  364. #. type: Plain text
  365. #: en/./developers/01_First_steps.md:61 en/./developers/03_Backend/02_Minz.md:4 en/./developers/03_Backend/02_Minz.md:8 en/./developers/03_Backend/02_Minz.md:12 en/./developers/03_Backend/02_Minz.md:16 en/./developers/03_Backend/02_Minz.md:20 en/./developers/03_Backend/02_Minz.md:24 en/./developers/03_Backend/02_Minz.md:27 en/./developers/03_Backend/04_Changing_source_code.md:4 en/./developers/03_Backend/04_Changing_source_code.md:8 en/./developers/03_Backend/04_Changing_source_code.md:12 en/./developers/03_Backend/04_Changing_source_code.md:15 en/./developers/03_Backend/05_Extensions.md:342 en/./developers/03_Backend/05_Extensions.md:381 en/./developers/04_Frontend/01_View_files.md:4 en/./developers/04_Frontend/01_View_files.md:8 en/./developers/04_Frontend/01_View_files.md:12 en/./developers/04_Frontend/01_View_files.md:15 en/./developers/04_Frontend/02_Design.md:4 en/./developers/04_Frontend/02_Design.md:8 en/./developers/04_Frontend/02_Design.md:11 en/./users/03_Main_view.md:4 en/./users/03_Main_view.md:8 en/./users/03_Main_view.md:12 en/./users/04_Subscriptions.md:4 en/./users/04_Subscriptions.md:8 en/./users/04_Subscriptions.md:19 en/./users/05_Configuration.md:70 en/./users/05_Configuration.md:74 en/./users/05_Configuration.md:128 en/./users/05_Configuration.md:153 en/./users/05_Configuration.md:157 en/./users/05_Configuration.md:161
  366. #, no-wrap
  367. msgid "**TODO**\n"
  368. msgstr ""
  369. #. type: Title #
  370. #: en/./developers/01_First_steps.md:62
  371. #, no-wrap
  372. msgid "Extensions"
  373. msgstr ""
  374. #. type: Plain text
  375. #: en/./developers/01_First_steps.md:65
  376. msgid ""
  377. "If you want to create your own FreshRSS extension, take a look at the "
  378. "[extension documentation](03_Backend/05_Extensions.md)."
  379. msgstr ""
  380. #. type: Title #
  381. #: en/./developers/01_First_steps.md:66
  382. #, no-wrap
  383. msgid "Coding style"
  384. msgstr ""
  385. #. type: Plain text
  386. #: en/./developers/01_First_steps.md:69
  387. msgid ""
  388. "If you want to contribute to the source code, it's important to follow the "
  389. "project's coding style. The actual code doesn't always follow it throughout "
  390. "the project, but we should fix it every time an opportunity presents itself."
  391. msgstr ""
  392. #. type: Plain text
  393. #: en/./developers/01_First_steps.md:71
  394. msgid ""
  395. "Contributions which don't follow the coding style will be rejected as long "
  396. "as the coding style is not fixed."
  397. msgstr ""
  398. #. type: Title ##
  399. #: en/./developers/01_First_steps.md:72
  400. #, no-wrap
  401. msgid "Spaces, tabs and other whitespace characters"
  402. msgstr ""
  403. #. type: Title ###
  404. #: en/./developers/01_First_steps.md:74
  405. #, no-wrap
  406. msgid "Indentation"
  407. msgstr ""
  408. #. type: Plain text
  409. #: en/./developers/01_First_steps.md:76
  410. msgid "Code indentation must use tabs."
  411. msgstr ""
  412. #. type: Title ###
  413. #: en/./developers/01_First_steps.md:77
  414. #, no-wrap
  415. msgid "Alignment"
  416. msgstr ""
  417. #. type: Plain text
  418. #: en/./developers/01_First_steps.md:80
  419. msgid ""
  420. "Once the code has been correctly indented, it might be useful to align it "
  421. "for ease of reading. In that case, please use spaces."
  422. msgstr ""
  423. #. type: Code fence info string
  424. #: en/./developers/01_First_steps.md:81 en/./developers/01_First_steps.md:111 en/./developers/01_First_steps.md:123 en/./developers/01_First_steps.md:158 en/./developers/01_First_steps.md:173 en/./developers/01_First_steps.md:186 en/./developers/01_First_steps.md:196 en/./developers/01_First_steps.md:213 en/./developers/01_First_steps.md:228 en/./developers/03_Backend/05_Extensions.md:47 en/./developers/03_Backend/05_Extensions.md:88 en/./developers/03_Backend/05_Extensions.md:130 en/./developers/03_Backend/05_Extensions.md:149 en/./developers/03_Backend/05_Extensions.md:166 en/./developers/03_Backend/05_Extensions.md:188 en/./developers/03_Backend/05_Extensions.md:225 en/./developers/05_Release_new_version.md:53 en/./users/06_Fever_API.md:107
  425. #, no-wrap
  426. msgid "php"
  427. msgstr ""
  428. #. type: Plain text
  429. #: en/./developers/01_First_steps.md:81
  430. #, no-wrap
  431. msgid ""
  432. "$result = a_function_with_a_really_long_name($param1, $param2,\n"
  433. " $param3, $param4);\n"
  434. msgstr ""
  435. #. type: Title ###
  436. #: en/./developers/01_First_steps.md:86
  437. #, no-wrap
  438. msgid "End of line"
  439. msgstr ""
  440. #. type: Plain text
  441. #: en/./developers/01_First_steps.md:89
  442. msgid ""
  443. "The newline character must be a line feed (LF), which is the default line "
  444. "ending on *NIX systems. This character must not follow other white space."
  445. msgstr ""
  446. #. type: Plain text
  447. #: en/./developers/01_First_steps.md:91
  448. msgid ""
  449. "You can verify if there is any unintended white space at the end of line "
  450. "with the following Git command:"
  451. msgstr ""
  452. #. type: Code fence info string
  453. #: en/./developers/01_First_steps.md:92 en/./developers/02_Github.md:80 en/./developers/02_Github.md:85 en/./developers/02_Github.md:90 en/./developers/02_Github.md:96 en/./developers/02_Github.md:102 en/./developers/05_Release_new_version.md:15 en/./developers/05_Release_new_version.md:101
  454. #, no-wrap
  455. msgid "bash"
  456. msgstr ""
  457. #. type: Plain text
  458. #: en/./developers/01_First_steps.md:92
  459. #, no-wrap
  460. msgid ""
  461. "# command to check files before adding them in the Git index\n"
  462. "git diff --check\n"
  463. "# command to check files after adding them in the Git index\n"
  464. "git diff --check --cached\n"
  465. msgstr ""
  466. #. type: Title ###
  467. #: en/./developers/01_First_steps.md:99 en/./developers/01_First_steps.md:220
  468. #, no-wrap
  469. msgid "End of file"
  470. msgstr ""
  471. #. type: Plain text
  472. #: en/./developers/01_First_steps.md:102
  473. msgid "Every file must end by an empty line."
  474. msgstr ""
  475. #. type: Title ###
  476. #: en/./developers/01_First_steps.md:103
  477. #, no-wrap
  478. msgid "Commas, dots and semi-columns"
  479. msgstr ""
  480. #. type: Plain text
  481. #: en/./developers/01_First_steps.md:106
  482. msgid ""
  483. "There should no space before those characters, but there should be one "
  484. "after."
  485. msgstr ""
  486. #. type: Title ###
  487. #: en/./developers/01_First_steps.md:107 en/./developers/01_First_steps.md:210
  488. #, no-wrap
  489. msgid "Operators"
  490. msgstr ""
  491. #. type: Plain text
  492. #: en/./developers/01_First_steps.md:110
  493. msgid "There should be a space before and after every operator."
  494. msgstr ""
  495. #. type: Plain text
  496. #: en/./developers/01_First_steps.md:111
  497. #, no-wrap
  498. msgid ""
  499. "if ($a == 10) {\n"
  500. "\t// do something\n"
  501. "}\n"
  502. "\n"
  503. "echo $a ? 1 : 0;\n"
  504. msgstr ""
  505. #. type: Title ###
  506. #: en/./developers/01_First_steps.md:119
  507. #, no-wrap
  508. msgid "Parentheses"
  509. msgstr ""
  510. #. type: Plain text
  511. #: en/./developers/01_First_steps.md:122
  512. msgid ""
  513. "There should be no spaces in between brackets. There should be no spaces "
  514. "before the opening bracket, except if it's after a keyword. There shouldn't "
  515. "be any spaces after the closing bracket, except if it's followed by a curly "
  516. "bracket."
  517. msgstr ""
  518. #. type: Plain text
  519. #: en/./developers/01_First_steps.md:123
  520. #, no-wrap
  521. msgid ""
  522. "if ($a == 10) {\n"
  523. "\t// do something\n"
  524. "}\n"
  525. "\n"
  526. "if ((int)$a == 10) {\n"
  527. "\t// do something\n"
  528. "}\n"
  529. msgstr ""
  530. #. type: Title ###
  531. #: en/./developers/01_First_steps.md:133
  532. #, no-wrap
  533. msgid "With chained functions"
  534. msgstr ""
  535. #. type: Plain text
  536. #: en/./developers/01_First_steps.md:136
  537. msgid ""
  538. "It happens most of the time in Javascript files. When there are chained "
  539. "functions with closures and callback functions, it's hard to understand the "
  540. "code if not properly formatted. In those cases, we add a new indent level "
  541. "for the complete instruction and reset the indent for a new instruction on "
  542. "the same level."
  543. msgstr ""
  544. #. type: Code fence info string
  545. #: en/./developers/01_First_steps.md:137
  546. #, no-wrap
  547. msgid "javascript"
  548. msgstr ""
  549. #. type: Plain text
  550. #: en/./developers/01_First_steps.md:137
  551. #, no-wrap
  552. msgid ""
  553. "// First instruction\n"
  554. "shortcut.add(shortcuts.mark_read, function () {\n"
  555. "\t\t//...\n"
  556. "\t}, {\n"
  557. "\t\t'disable_in_input': true\n"
  558. "\t});\n"
  559. "// Second instruction\n"
  560. "shortcut.add(\"shift+\" + shortcuts.mark_read, function () {\n"
  561. "\t\t//...\n"
  562. "\t}, {\n"
  563. "\t\t'disable_in_input': true\n"
  564. "\t});\n"
  565. msgstr ""
  566. #. type: Title ##
  567. #: en/./developers/01_First_steps.md:152
  568. #, no-wrap
  569. msgid "Line length"
  570. msgstr ""
  571. #. type: Plain text
  572. #: en/./developers/01_First_steps.md:155
  573. msgid ""
  574. "Lines should strive to be shorter than 80 characters. However, this limit "
  575. "may be extended to 100 characters when strictly necessary."
  576. msgstr ""
  577. #. type: Plain text
  578. #: en/./developers/01_First_steps.md:157
  579. msgid "With functions, parameters can be declared on multiple lines."
  580. msgstr ""
  581. #. type: Plain text
  582. #: en/./developers/01_First_steps.md:158
  583. #, no-wrap
  584. msgid ""
  585. "function my_function($param_1, $param_2,\n"
  586. " $param_3, $param_4) {\n"
  587. "\t// do something\n"
  588. "}\n"
  589. msgstr ""
  590. #. type: Title ##
  591. #: en/./developers/01_First_steps.md:165
  592. #, no-wrap
  593. msgid "Naming"
  594. msgstr ""
  595. #. type: Plain text
  596. #: en/./developers/01_First_steps.md:168
  597. msgid ""
  598. "All code elements (functions, classes, methods and variables) must describe "
  599. "their usage succinctly."
  600. msgstr ""
  601. #. type: Title ###
  602. #: en/./developers/01_First_steps.md:169
  603. #, no-wrap
  604. msgid "Functions and variables"
  605. msgstr ""
  606. #. type: Plain text
  607. #: en/./developers/01_First_steps.md:172
  608. msgid "Functions and variables must follow the \"snake case\" naming convention."
  609. msgstr ""
  610. #. type: Plain text
  611. #: en/./developers/01_First_steps.md:173
  612. #, no-wrap
  613. msgid ""
  614. "// a function\n"
  615. "function function_name() {\n"
  616. "\t// do something\n"
  617. "}\n"
  618. "// a variable\n"
  619. "$variable_name;\n"
  620. msgstr ""
  621. #. type: Title ###
  622. #: en/./developers/01_First_steps.md:182
  623. #, no-wrap
  624. msgid "Methods"
  625. msgstr ""
  626. #. type: Plain text
  627. #: en/./developers/01_First_steps.md:185
  628. msgid "Methods must follow the \"lower camel case\" naming convention."
  629. msgstr ""
  630. #. type: Plain text
  631. #: en/./developers/01_First_steps.md:186
  632. #, no-wrap
  633. msgid ""
  634. "private function methodName() {\n"
  635. "\t// do something\n"
  636. "}\n"
  637. msgstr ""
  638. #. type: Title ###
  639. #: en/./developers/01_First_steps.md:192
  640. #, no-wrap
  641. msgid "Classes"
  642. msgstr ""
  643. #. type: Plain text
  644. #: en/./developers/01_First_steps.md:195
  645. msgid "Classes must follow the \"upper camel case\" naming convention."
  646. msgstr ""
  647. #. type: Plain text
  648. #: en/./developers/01_First_steps.md:196
  649. #, no-wrap
  650. msgid "abstract class ClassName {}\n"
  651. msgstr ""
  652. #. type: Title ##
  653. #: en/./developers/01_First_steps.md:200
  654. #, no-wrap
  655. msgid "Encoding"
  656. msgstr ""
  657. #. type: Plain text
  658. #: en/./developers/01_First_steps.md:203
  659. msgid "Files must be encoded with the UTF-8 character set."
  660. msgstr ""
  661. #. type: Title ##
  662. #: en/./developers/01_First_steps.md:204
  663. #, no-wrap
  664. msgid "PHP compatibility"
  665. msgstr ""
  666. #. type: Plain text
  667. #: en/./developers/01_First_steps.md:207
  668. msgid ""
  669. "Please ensure that your code works with the oldest PHP version officially "
  670. "supported by FreshRSS."
  671. msgstr ""
  672. #. type: Title ##
  673. #: en/./developers/01_First_steps.md:208
  674. #, no-wrap
  675. msgid "Miscellaneous"
  676. msgstr ""
  677. #. type: Plain text
  678. #: en/./developers/01_First_steps.md:212
  679. msgid ""
  680. "Operators must be at the end of the line if a condition is split over more "
  681. "than one line."
  682. msgstr ""
  683. #. type: Plain text
  684. #: en/./developers/01_First_steps.md:213
  685. #, no-wrap
  686. msgid ""
  687. "if ($a == 10 ||\n"
  688. " $a == 20) {\n"
  689. "\t// do something\n"
  690. "}\n"
  691. msgstr ""
  692. #. type: Plain text
  693. #: en/./developers/01_First_steps.md:223
  694. msgid "If the file contains only PHP code, the PHP closing tag must be omitted."
  695. msgstr ""
  696. #. type: Title ###
  697. #: en/./developers/01_First_steps.md:224
  698. #, no-wrap
  699. msgid "Arrays"
  700. msgstr ""
  701. #. type: Plain text
  702. #: en/./developers/01_First_steps.md:227
  703. msgid ""
  704. "If an array declaration runs on more than one line, each element must be "
  705. "followed by a comma, including the last one."
  706. msgstr ""
  707. #. type: Plain text
  708. #: en/./developers/01_First_steps.md:228
  709. #, no-wrap
  710. msgid ""
  711. "$variable = [\n"
  712. "\t\"value 1\",\n"
  713. "\t\"value 2\",\n"
  714. "\t\"value 3\",\n"
  715. "];\n"
  716. msgstr ""
  717. #. type: Title #
  718. #: en/./developers/02_Github.md:1
  719. #, no-wrap
  720. msgid "Reporting a bug or a suggestion"
  721. msgstr ""
  722. #. type: Plain text
  723. #: en/./developers/02_Github.md:4
  724. msgid ""
  725. "Despite the care given to FreshRSS, it's still possible that bugs occur. The "
  726. "project is young and development is dynamic, so it can be corrected "
  727. "quickly. You might also have a feature in mind that doesn't yet "
  728. "exist. Regardless whether your idea seems silly, far-fetched, useless or too "
  729. "specific, please don't hesitate to propose it to us! \"Ideas in the air\" "
  730. "often find an attentive ear. It's new external perspectives that make the "
  731. "project evolve the most."
  732. msgstr ""
  733. #. type: Plain text
  734. #: en/./developers/02_Github.md:6
  735. msgid ""
  736. "If you're convinced that you should be heard, here's how you can go about "
  737. "it."
  738. msgstr ""
  739. #. type: Title ##
  740. #: en/./developers/02_Github.md:7
  741. #, no-wrap
  742. msgid "On GitHub"
  743. msgstr ""
  744. #. type: Plain text
  745. #: en/./developers/02_Github.md:10
  746. msgid ""
  747. "GitHub is the ideal platform to submit your requests. It allows us to "
  748. "discuss a problem or suggestion with others and it often generates new "
  749. "ideas. Let's not neglect this \"social\" aspect!"
  750. msgstr ""
  751. #. type: Bullet: ' 1. '
  752. #: en/./developers/02_Github.md:16
  753. msgid "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
  754. msgstr ""
  755. #. type: Bullet: ' 2. '
  756. #: en/./developers/02_Github.md:16
  757. msgid ""
  758. "Start by checking if a similar request hasn't already been made. If so, "
  759. "please feel free to add your voice to the request."
  760. msgstr ""
  761. #. type: Bullet: ' 3. '
  762. #: en/./developers/02_Github.md:16
  763. msgid ""
  764. "If your request is new, [open a new bug "
  765. "ticket](https://github.com/FreshRSS/FreshRSS/issues/new)"
  766. msgstr ""
  767. #. type: Bullet: ' 4. '
  768. #: en/./developers/02_Github.md:16
  769. msgid ""
  770. "Finally, write your request. If you're fluent in English, it's the preferred "
  771. "language because it allows for discussion with the largest number of people."
  772. msgstr ""
  773. #. type: Bullet: ' 5. '
  774. #: en/./developers/02_Github.md:16
  775. msgid "Please follow the tips below to make it easier to let your ticket be heard."
  776. msgstr ""
  777. #. type: Title ##
  778. #: en/./developers/02_Github.md:17
  779. #, no-wrap
  780. msgid "Informal"
  781. msgstr ""
  782. #. type: Plain text
  783. #: en/./developers/02_Github.md:20
  784. msgid ""
  785. "Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
  786. "is why you can also contact us in a more informal way."
  787. msgstr ""
  788. #. type: Bullet: '* '
  789. #: en/./developers/02_Github.md:26
  790. msgid ""
  791. "On [our Mattermost "
  792. "chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)"
  793. msgstr ""
  794. #. type: Bullet: '* '
  795. #: en/./developers/02_Github.md:26
  796. msgid ""
  797. "On [the mailing "
  798. "lists](https://freshrss.org/announce-of-the-mailing-lists.html)"
  799. msgstr ""
  800. #. type: Bullet: '* '
  801. #: en/./developers/02_Github.md:26
  802. msgid "At events / meetings around Free Software"
  803. msgstr ""
  804. #. type: Bullet: '* '
  805. #: en/./developers/02_Github.md:26
  806. msgid "Over a beer in a bar"
  807. msgstr ""
  808. #. type: Bullet: '* '
  809. #: en/./developers/02_Github.md:26
  810. msgid "Etc."
  811. msgstr ""
  812. #. type: Title ##
  813. #: en/./developers/02_Github.md:27
  814. #, no-wrap
  815. msgid "Tips"
  816. msgstr ""
  817. #. type: Plain text
  818. #: en/./developers/02_Github.md:30
  819. msgid "Here are some tips to help you present your bug report or suggestion:"
  820. msgstr ""
  821. #. type: Bullet: '* '
  822. #: en/./developers/02_Github.md:39
  823. msgid "**Pay attention to spelling**. Even if it's not always easy, try your best!"
  824. msgstr ""
  825. #. type: Bullet: '* '
  826. #: en/./developers/02_Github.md:39
  827. msgid ""
  828. "**Give an explicit title to your request**, even if it's a bit long. This "
  829. "not only helps us understand your request, but also to find your ticket "
  830. "later."
  831. msgstr ""
  832. #. type: Bullet: '* '
  833. #: en/./developers/02_Github.md:39
  834. msgid ""
  835. "**One request = one ticket.** You may have lots of ideas while being afraid "
  836. "to spam the bug manager: it doesn't matter. It's better to have a few too "
  837. "many tickets than too many requests in one. We'll close and consolidate "
  838. "requests when possible."
  839. msgstr ""
  840. #. type: Bullet: '* '
  841. #: en/./developers/02_Github.md:39
  842. msgid ""
  843. "If you report a bug, think about **providing us with the FreshRSS logs** "
  844. "(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
  845. "location may vary by distribution, but consider searching in "
  846. "`/var/log/httpd` or `/var/log/apache`)."
  847. msgstr ""
  848. #. type: Bullet: '* '
  849. #: en/./developers/02_Github.md:39
  850. msgid ""
  851. "If you can't find the log files, specify it in your ticket so we know you've "
  852. "already searched."
  853. msgstr ""
  854. #. type: Bullet: '* '
  855. #: en/./developers/02_Github.md:39
  856. msgid ""
  857. "Not all bugs require logs, but if you have any doubts, it is better to "
  858. "provide them to us. Logs are important and very useful for debugging!"
  859. msgstr ""
  860. #. type: Bullet: '* '
  861. #: en/./developers/02_Github.md:39
  862. msgid ""
  863. "The logs may reveal confidential information, so **be careful not to "
  864. "disclose anything sensitive.**"
  865. msgstr ""
  866. #. type: Plain text
  867. #: en/./developers/02_Github.md:41
  868. msgid ""
  869. "In addition, when facing a bug, you're encouraged to follow this message "
  870. "format (from the [Sam & Max "
  871. "website](http://sametmax.com/template-de-demande-daide-en-informatique/):"
  872. msgstr ""
  873. #. type: Title ###
  874. #: en/./developers/02_Github.md:42
  875. #, no-wrap
  876. msgid "What's my goal?"
  877. msgstr ""
  878. #. type: Plain text
  879. #: en/./developers/02_Github.md:45
  880. msgid "Give the general context of what you were trying to do."
  881. msgstr ""
  882. #. type: Title ###
  883. #: en/./developers/02_Github.md:46
  884. #, no-wrap
  885. msgid "What have I been trying to do?"
  886. msgstr ""
  887. #. type: Plain text
  888. #: en/./developers/02_Github.md:49
  889. msgid "Explain step by step what you have done so that we can reproduce the bug."
  890. msgstr ""
  891. #. type: Title ###
  892. #: en/./developers/02_Github.md:50
  893. #, no-wrap
  894. msgid "What results have I achieved?"
  895. msgstr ""
  896. #. type: Plain text
  897. #: en/./developers/02_Github.md:53
  898. msgid ""
  899. "The bug: what you see that shouldn't have happened. Here you can provide the "
  900. "logs."
  901. msgstr ""
  902. #. type: Title ###
  903. #: en/./developers/02_Github.md:54
  904. #, no-wrap
  905. msgid "What was the expected result?"
  906. msgstr ""
  907. #. type: Plain text
  908. #: en/./developers/02_Github.md:57
  909. msgid "So that we understand what you consider to be the problem."
  910. msgstr ""
  911. #. type: Title ###
  912. #: en/./developers/02_Github.md:58
  913. #, no-wrap
  914. msgid "What are my circumstances?"
  915. msgstr ""
  916. #. type: Plain text
  917. #: en/./developers/02_Github.md:61
  918. msgid "Remember to give the following information if you know it:"
  919. msgstr ""
  920. #. type: Bullet: ' 1. '
  921. #: en/./developers/02_Github.md:67
  922. msgid "Which browser? Which version?"
  923. msgstr ""
  924. #. type: Bullet: ' 2. '
  925. #: en/./developers/02_Github.md:67
  926. msgid "Which server: Apache, Nginx? Which version?"
  927. msgstr ""
  928. #. type: Bullet: ' 3. '
  929. #: en/./developers/02_Github.md:67
  930. msgid "Which version of PHP?"
  931. msgstr ""
  932. #. type: Bullet: ' 4. '
  933. #: en/./developers/02_Github.md:67
  934. msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
  935. msgstr ""
  936. #. type: Bullet: ' 5. '
  937. #: en/./developers/02_Github.md:67
  938. msgid "Which distribution runs on the server? And... which version?"
  939. msgstr ""
  940. #. type: Title #
  941. #: en/./developers/02_Github.md:68
  942. #, no-wrap
  943. msgid "Branching"
  944. msgstr ""
  945. #. type: Title ##
  946. #: en/./developers/02_Github.md:70
  947. #, no-wrap
  948. msgid "Basic"
  949. msgstr ""
  950. #. type: Plain text
  951. #: en/./developers/02_Github.md:72
  952. msgid "If you are new to Git, here are some of the resources you might find useful:"
  953. msgstr ""
  954. #. type: Bullet: '* '
  955. #: en/./developers/02_Github.md:77
  956. msgid "[GitHub's blog post](https://github.com/blog/120-new-to-git)"
  957. msgstr ""
  958. #. type: Bullet: '* '
  959. #: en/./developers/02_Github.md:77
  960. msgid "<http://try.github.com/>"
  961. msgstr ""
  962. #. type: Bullet: '* '
  963. #: en/./developers/02_Github.md:77
  964. msgid "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
  965. msgstr ""
  966. #. type: Bullet: '* '
  967. #: en/./developers/02_Github.md:77
  968. msgid "<http://rogerdudler.github.io/git-guide/>"
  969. msgstr ""
  970. #. type: Title ##
  971. #: en/./developers/02_Github.md:78
  972. #, no-wrap
  973. msgid "Getting the latest code from the FreshRSS repository"
  974. msgstr ""
  975. #. type: Plain text
  976. #: en/./developers/02_Github.md:80
  977. msgid "First you need to add the official repo to your remote repo list:"
  978. msgstr ""
  979. #. type: Plain text
  980. #: en/./developers/02_Github.md:80
  981. #, no-wrap
  982. msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n"
  983. msgstr ""
  984. #. type: Plain text
  985. #: en/./developers/02_Github.md:85
  986. msgid "You can verify the remote repo is successfully added by using:"
  987. msgstr ""
  988. #. type: Plain text
  989. #: en/./developers/02_Github.md:85
  990. #, no-wrap
  991. msgid "git remote -v show\n"
  992. msgstr ""
  993. #. type: Plain text
  994. #: en/./developers/02_Github.md:90
  995. msgid "Now you can pull the latest development code:"
  996. msgstr ""
  997. #. type: Plain text
  998. #: en/./developers/02_Github.md:90
  999. #, no-wrap
  1000. msgid ""
  1001. "git checkout master\n"
  1002. "git pull upstream master\n"
  1003. msgstr ""
  1004. #. type: Title ##
  1005. #: en/./developers/02_Github.md:95
  1006. #, no-wrap
  1007. msgid "Starting a new development branch"
  1008. msgstr ""
  1009. #. type: Plain text
  1010. #: en/./developers/02_Github.md:96
  1011. #, no-wrap
  1012. msgid "git checkout -b my-development-branch\n"
  1013. msgstr ""
  1014. #. type: Title #
  1015. #: en/./developers/02_Github.md:100
  1016. #, no-wrap
  1017. msgid "Sending a patch"
  1018. msgstr ""
  1019. #. type: Plain text
  1020. #: en/./developers/02_Github.md:102
  1021. #, no-wrap
  1022. msgid ""
  1023. "# Add the changed file, here actualize_script.php\n"
  1024. "git add app/actualize_script.php\n"
  1025. "# Commit the change and write a proper commit message\n"
  1026. "git commit\n"
  1027. "# Double check all looks well\n"
  1028. "git show\n"
  1029. "# Push it to your fork\n"
  1030. "git push\n"
  1031. msgstr ""
  1032. #. type: Plain text
  1033. #: en/./developers/02_Github.md:114
  1034. msgid "Now you can create a PR based on your branch."
  1035. msgstr ""
  1036. #. type: Title ##
  1037. #: en/./developers/02_Github.md:115
  1038. #, no-wrap
  1039. msgid "How to write a commit message"
  1040. msgstr ""
  1041. #. type: Plain text
  1042. #: en/./developers/02_Github.md:118
  1043. msgid ""
  1044. "A commit message should succintly describe the changes on the first "
  1045. "line. For example:"
  1046. msgstr ""
  1047. #. type: Plain text
  1048. #: en/./developers/02_Github.md:120
  1049. #, no-wrap
  1050. msgid "> Fix broken icon\n"
  1051. msgstr ""
  1052. #. type: Plain text
  1053. #: en/./developers/02_Github.md:122
  1054. msgid "If necessary, this can be followed by a blank line and a longer explanation."
  1055. msgstr ""
  1056. #. type: Plain text
  1057. #: en/./developers/02_Github.md:123
  1058. msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)."
  1059. msgstr ""
  1060. #. type: Title #
  1061. #: en/./developers/03_Backend/02_Minz.md:1
  1062. #, no-wrap
  1063. msgid "Models"
  1064. msgstr ""
  1065. #. type: Title #
  1066. #: en/./developers/03_Backend/02_Minz.md:5
  1067. #, no-wrap
  1068. msgid "Controllers and actions"
  1069. msgstr ""
  1070. #. type: Title ###
  1071. #: en/./developers/03_Backend/02_Minz.md:9 en/./developers/03_Backend/05_Extensions.md:69
  1072. #, no-wrap
  1073. msgid "Views"
  1074. msgstr ""
  1075. #. type: Title ###
  1076. #: en/./developers/03_Backend/02_Minz.md:13 en/./developers/03_Backend/05_Extensions.md:39
  1077. #, no-wrap
  1078. msgid "Routing"
  1079. msgstr ""
  1080. #. type: Title #
  1081. #: en/./developers/03_Backend/02_Minz.md:17
  1082. #, no-wrap
  1083. msgid "Writing URL"
  1084. msgstr ""
  1085. #. type: Title #
  1086. #: en/./developers/03_Backend/02_Minz.md:21 en/./developers/04_Frontend/01_View_files.md:13
  1087. #, no-wrap
  1088. msgid "Internationalisation"
  1089. msgstr ""
  1090. #. type: Title #
  1091. #: en/./developers/03_Backend/02_Minz.md:25
  1092. #, no-wrap
  1093. msgid "Understanding internals"
  1094. msgstr ""
  1095. #. type: Title #
  1096. #: en/./developers/03_Backend/04_Changing_source_code.md:1
  1097. #, no-wrap
  1098. msgid "Accessing the database"
  1099. msgstr ""
  1100. #. type: Title #
  1101. #: en/./developers/03_Backend/04_Changing_source_code.md:5
  1102. #, no-wrap
  1103. msgid "Writing an action and its related view"
  1104. msgstr ""
  1105. #. type: Title #
  1106. #: en/./developers/03_Backend/04_Changing_source_code.md:9
  1107. #, no-wrap
  1108. msgid "Authentication"
  1109. msgstr ""
  1110. #. type: Title #
  1111. #: en/./developers/03_Backend/04_Changing_source_code.md:13
  1112. #, no-wrap
  1113. msgid "Logs"
  1114. msgstr ""
  1115. #. type: Title #
  1116. #: en/./developers/03_Backend/05_Extensions.md:1
  1117. #, no-wrap
  1118. msgid "Writing extensions for FreshRSS"
  1119. msgstr ""
  1120. #. type: Title ##
  1121. #: en/./developers/03_Backend/05_Extensions.md:3
  1122. #, no-wrap
  1123. msgid "About FreshRSS"
  1124. msgstr ""
  1125. #. type: Plain text
  1126. #: en/./developers/03_Backend/05_Extensions.md:6
  1127. msgid ""
  1128. "FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to "
  1129. "October 2012. The official site is located at "
  1130. "[freshrss.org](https://freshrss.org) and the official repository is hosted "
  1131. "on Github: "
  1132. "[github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS)."
  1133. msgstr ""
  1134. #. type: Title ##
  1135. #: en/./developers/03_Backend/05_Extensions.md:7
  1136. #, no-wrap
  1137. msgid "The problem"
  1138. msgstr ""
  1139. #. type: Plain text
  1140. #: en/./developers/03_Backend/05_Extensions.md:10
  1141. msgid "FreshRSS is limited in its technical possibilities by various factors:"
  1142. msgstr ""
  1143. #. type: Bullet: '* '
  1144. #: en/./developers/03_Backend/05_Extensions.md:14
  1145. msgid "The number of developers"
  1146. msgstr ""
  1147. #. type: Bullet: '* '
  1148. #: en/./developers/03_Backend/05_Extensions.md:14
  1149. msgid "The will to integrate certain changes"
  1150. msgstr ""
  1151. #. type: Bullet: '* '
  1152. #: en/./developers/03_Backend/05_Extensions.md:14
  1153. msgid "The level of \"hacking\" required to integrate marginal features"
  1154. msgstr ""
  1155. #. type: Plain text
  1156. #: en/./developers/03_Backend/05_Extensions.md:16
  1157. msgid ""
  1158. "While the first limitation can, in theory, be lifted by the participation of "
  1159. "new contributors to the project, it depends on the willingness of "
  1160. "contributors to take an interest in the source code of the entire "
  1161. "project. In order to remove the other two limitations, most of the time it "
  1162. "will be necessary to create a \"fork\"."
  1163. msgstr ""
  1164. #. type: Plain text
  1165. #: en/./developers/03_Backend/05_Extensions.md:18
  1166. msgid ""
  1167. "Another solution consists of an extension system. By allowing users to write "
  1168. "their own extension without taking an interest in the core of the basic "
  1169. "software, we allow for:"
  1170. msgstr ""
  1171. #. type: Bullet: '1. '
  1172. #: en/./developers/03_Backend/05_Extensions.md:22
  1173. msgid "Reducing the amount of source code a new contributor has to take in"
  1174. msgstr ""
  1175. #. type: Bullet: '2. '
  1176. #: en/./developers/03_Backend/05_Extensions.md:22
  1177. msgid "Unofficial integration of novelties"
  1178. msgstr ""
  1179. #. type: Bullet: '3. '
  1180. #: en/./developers/03_Backend/05_Extensions.md:22
  1181. msgid "No forking or main developer approval required."
  1182. msgstr ""
  1183. #. type: Plain text
  1184. #: en/./developers/03_Backend/05_Extensions.md:24
  1185. msgid ""
  1186. "Note: it is quite conceivable that the functionalities of an extension can "
  1187. "later be officially integrated into the FreshRSS code. Extensions make it "
  1188. "easy to propose a proof of concept."
  1189. msgstr ""
  1190. #. type: Title ##
  1191. #: en/./developers/03_Backend/05_Extensions.md:25
  1192. #, no-wrap
  1193. msgid "Understanding basic mechanics (Minz and MVC)"
  1194. msgstr ""
  1195. #. type: Plain text
  1196. #: en/./developers/03_Backend/05_Extensions.md:28
  1197. #, no-wrap
  1198. msgid "**TODO** : move to 02_Minz.md\n"
  1199. msgstr ""
  1200. #. type: Plain text
  1201. #: en/./developers/03_Backend/05_Extensions.md:30
  1202. msgid ""
  1203. "This data sheet should refer to the official FreshRSS and Minz documentation "
  1204. "(the PHP framework on which FreshRSS is based). Unfortunately, this "
  1205. "documentation does not yet exist. In a few words, here are the main things "
  1206. "you should know. It is not necessary to read all the chapters in this "
  1207. "section if you don't need to use a feature in your extension (if you don't "
  1208. "need to translate your extension, no need to know more about the "
  1209. "`Minz_Translate` module for example)."
  1210. msgstr ""
  1211. #. type: Title ###
  1212. #: en/./developers/03_Backend/05_Extensions.md:31
  1213. #, no-wrap
  1214. msgid "MVC Architecture"
  1215. msgstr ""
  1216. #. type: Plain text
  1217. #: en/./developers/03_Backend/05_Extensions.md:34
  1218. msgid ""
  1219. "Minz relies on and imposes an MVC architecture on projects using it. This "
  1220. "architecture consists of three main components:"
  1221. msgstr ""
  1222. #. type: Bullet: '* '
  1223. #: en/./developers/03_Backend/05_Extensions.md:38
  1224. msgid ""
  1225. "The model: this is the base object that we will manipulate. In FreshRSS, "
  1226. "categories, flows and articles are templates. The part of the code that "
  1227. "makes it possible to manipulate them in a database is also part of the model "
  1228. "but is separated from the base model: we speak of DAO (for \"Data Access "
  1229. "Object\"). The templates are stored in a `Models` folder."
  1230. msgstr ""
  1231. #. type: Bullet: '* '
  1232. #: en/./developers/03_Backend/05_Extensions.md:38
  1233. msgid ""
  1234. "The view: this is what the user sees. The view is therefore simply HTML code "
  1235. "mixed with PHP to display dynamic information. The views are stored in a "
  1236. "`views` folder."
  1237. msgstr ""
  1238. #. type: Bullet: '* '
  1239. #: en/./developers/03_Backend/05_Extensions.md:38
  1240. msgid ""
  1241. "The controller: this is what makes it possible to link models and "
  1242. "views. Typically, a controller will load templates from the database (like a "
  1243. "list of items) to \"pass\" them to a view for display. Controllers are "
  1244. "stored in a `Controllers` directory."
  1245. msgstr ""
  1246. #. type: Plain text
  1247. #: en/./developers/03_Backend/05_Extensions.md:42
  1248. msgid ""
  1249. "In order to link a URL to a controller, first you have to go through a "
  1250. "\"routing\" phase. In FreshRSS, this is particularly simple because it "
  1251. "suffices to specify the name of the controller to load into the URL using a "
  1252. "`c` parameter. For example, the address http://exemple.com?c=hello will "
  1253. "execute the code contained in the `hello` controller."
  1254. msgstr ""
  1255. #. type: Plain text
  1256. #: en/./developers/03_Backend/05_Extensions.md:44
  1257. msgid ""
  1258. "One concept that has not yet been discussed is the \"actions\" system. An "
  1259. "action is executed *on* a controller. Concretely, a controller is "
  1260. "represented by a class and its actions by methods. To execute an action, it "
  1261. "is necessary to specify an `a` parameter in the URL."
  1262. msgstr ""
  1263. #. type: Plain text
  1264. #: en/./developers/03_Backend/05_Extensions.md:46 en/./developers/03_Backend/05_Extensions.md:165
  1265. msgid "Code example:"
  1266. msgstr ""
  1267. #. type: Plain text
  1268. #: en/./developers/03_Backend/05_Extensions.md:47
  1269. #, no-wrap
  1270. msgid ""
  1271. "<?php\n"
  1272. "\n"
  1273. "class FreshRSS_hello_Controller extends Minz_ActionController {\n"
  1274. "\tpublic function indexAction() {\n"
  1275. "\t\t$this->view->a_variable = 'FooBar';\n"
  1276. "\t}\n"
  1277. "\n"
  1278. "\tpublic function worldAction() {\n"
  1279. "\t\t$this->view->a_variable = 'Hello World!';\n"
  1280. "\t}\n"
  1281. "}\n"
  1282. "\n"
  1283. "?>\n"
  1284. msgstr ""
  1285. #. type: Plain text
  1286. #: en/./developers/03_Backend/05_Extensions.md:64
  1287. msgid ""
  1288. "When loading the address http://exemple.com?c=hello&a=world, the `world` "
  1289. "action is executed on the `hello` controller."
  1290. msgstr ""
  1291. #. type: Plain text
  1292. #: en/./developers/03_Backend/05_Extensions.md:66
  1293. msgid ""
  1294. "Note: if `c` or `a` is not specified, the default value for each of these "
  1295. "variables is `index`. So the address http://exemple.com?c=hello will execute "
  1296. "the `index` action of the `hello` controller."
  1297. msgstr ""
  1298. #. type: Plain text
  1299. #: en/./developers/03_Backend/05_Extensions.md:68
  1300. msgid ""
  1301. "From now on, the `hello/world` naming convention will be used to refer to a "
  1302. "controller/action pair."
  1303. msgstr ""
  1304. #. type: Plain text
  1305. #: en/./developers/03_Backend/05_Extensions.md:72
  1306. msgid ""
  1307. "Each view is associated with a controller and an action. The view associated "
  1308. "with `hello/world` will be stored in a very specific file: "
  1309. "`views/hello/world. phtml`. This convention is imposed by Minz."
  1310. msgstr ""
  1311. #. type: Plain text
  1312. #: en/./developers/03_Backend/05_Extensions.md:74
  1313. msgid "As explained above, the views consist of HTML mixed with PHP. Code example:"
  1314. msgstr ""
  1315. #. type: Code fence info string
  1316. #: en/./developers/03_Backend/05_Extensions.md:75 en/./developers/03_Backend/05_Extensions.md:120 en/./developers/03_Backend/05_Extensions.md:248 en/./developers/03_Backend/05_Extensions.md:284 en/./developers/03_Backend/05_Extensions.md:351
  1317. #, no-wrap
  1318. msgid "html"
  1319. msgstr ""
  1320. #. type: Plain text
  1321. #: en/./developers/03_Backend/05_Extensions.md:75
  1322. #, no-wrap
  1323. msgid ""
  1324. "<p>\n"
  1325. "\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
  1326. "</p>\n"
  1327. msgstr ""
  1328. #. type: Plain text
  1329. #: en/./developers/03_Backend/05_Extensions.md:82
  1330. #, no-wrap
  1331. msgid ""
  1332. "The variable `$this->a_variable` is passed by the controller (see previous "
  1333. "example). The difference is that in the controller it is necessary to pass "
  1334. "`$this->view`, while in the view `$this` suffices.\n"
  1335. msgstr ""
  1336. #. type: Title ###
  1337. #: en/./developers/03_Backend/05_Extensions.md:83
  1338. #, no-wrap
  1339. msgid "Working with GET / POST"
  1340. msgstr ""
  1341. #. type: Plain text
  1342. #: en/./developers/03_Backend/05_Extensions.md:87
  1343. msgid ""
  1344. "It is often necessary to take advantage of parameters passed by GET or "
  1345. "POST. In Minz, these parameters are accessible using the `Minz_Request` "
  1346. "class. Code example:"
  1347. msgstr ""
  1348. #. type: Plain text
  1349. #: en/./developers/03_Backend/05_Extensions.md:88
  1350. #, no-wrap
  1351. msgid ""
  1352. "<?php\n"
  1353. "\n"
  1354. "$default_value = 'foo';\n"
  1355. "$param = Minz_Request::param('bar', $default_value);\n"
  1356. "\n"
  1357. "// Display the value of the parameter `bar` (passed via GET or POST)\n"
  1358. "// or \"foo\" if the parameter does not exist.\n"
  1359. "echo $param;\n"
  1360. "\n"
  1361. "// Sets the value of the `bar` parameter\n"
  1362. "Minz_Request::_param('bar', 'baz');\n"
  1363. "\n"
  1364. "// Will necessarily display \"baz\" since we have just forced its value.\n"
  1365. "// Note that the second parameter (default) is optional.\n"
  1366. "echo Minz_Request::param('bar');\n"
  1367. "\n"
  1368. "?>\n"
  1369. msgstr ""
  1370. #. type: Plain text
  1371. #: en/./developers/03_Backend/05_Extensions.md:109
  1372. msgid ""
  1373. "The `Minz_Request::isPost()` method can be used to execute a piece of code "
  1374. "only if it is a POST request."
  1375. msgstr ""
  1376. #. type: Plain text
  1377. #: en/./developers/03_Backend/05_Extensions.md:111
  1378. msgid ""
  1379. "Note: it is preferable to use `Minz_Request` only in controllers. It is "
  1380. "likely that you will encounter this method in FreshRSS views, or even in "
  1381. "templates, but be aware that this is **not** good practice."
  1382. msgstr ""
  1383. #. type: Title ###
  1384. #: en/./developers/03_Backend/05_Extensions.md:112
  1385. #, no-wrap
  1386. msgid "Access session settings"
  1387. msgstr ""
  1388. #. type: Plain text
  1389. #: en/./developers/03_Backend/05_Extensions.md:115
  1390. msgid ""
  1391. "The access to session parameters is strangely similar to the GET / POST "
  1392. "parameters but passes through the `Minz_Session` class this time! There is "
  1393. "no example here because you can repeat the previous example by changing all "
  1394. "`Minz_Request` to `Minz_Session`."
  1395. msgstr ""
  1396. #. type: Title ###
  1397. #: en/./developers/03_Backend/05_Extensions.md:116
  1398. #, no-wrap
  1399. msgid "Working with URLs"
  1400. msgstr ""
  1401. #. type: Plain text
  1402. #: en/./developers/03_Backend/05_Extensions.md:119
  1403. msgid ""
  1404. "To take full advantage of the Minz routing system, it is strongly "
  1405. "discouraged to write hard URLs in your code. For example, the following view "
  1406. "should be avoided:"
  1407. msgstr ""
  1408. #. type: Plain text
  1409. #: en/./developers/03_Backend/05_Extensions.md:120
  1410. #, no-wrap
  1411. msgid ""
  1412. "<p>\n"
  1413. "\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello "
  1414. "world</a>!\n"
  1415. "</p>\n"
  1416. msgstr ""
  1417. #. type: Plain text
  1418. #: en/./developers/03_Backend/05_Extensions.md:127
  1419. msgid ""
  1420. "If one day it was decided to use a \"url rewriting\" system to have "
  1421. "addresses in a http://exemple.com/controller/action format, all previous "
  1422. "addresses would become ineffective!"
  1423. msgstr ""
  1424. #. type: Plain text
  1425. #: en/./developers/03_Backend/05_Extensions.md:129
  1426. msgid ""
  1427. "So use the `Minz_Url` class and its `display()` method "
  1428. "instead. `Minz_Url::display()` takes an array of the following form as its "
  1429. "argument:"
  1430. msgstr ""
  1431. #. type: Plain text
  1432. #: en/./developers/03_Backend/05_Extensions.md:130
  1433. #, no-wrap
  1434. msgid ""
  1435. "<?php\n"
  1436. "\n"
  1437. "$url_array = [\n"
  1438. "\t'c' => 'hello',\n"
  1439. "\t'a' => 'world',\n"
  1440. "\t'params' => [\n"
  1441. "\t\t'foo' => 'bar',\n"
  1442. "\t],\n"
  1443. "];\n"
  1444. "\n"
  1445. "// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
  1446. "echo Minz_Url::display($url_array);\n"
  1447. "\n"
  1448. "?>\n"
  1449. msgstr ""
  1450. #. type: Plain text
  1451. #: en/./developers/03_Backend/05_Extensions.md:148
  1452. msgid ""
  1453. "Since this can become a bit tedious to use in the long run, especially in "
  1454. "views, it is preferable to use the `_url()` shortcut:"
  1455. msgstr ""
  1456. #. type: Plain text
  1457. #: en/./developers/03_Backend/05_Extensions.md:149
  1458. #, no-wrap
  1459. msgid ""
  1460. "<?php\n"
  1461. "\n"
  1462. "// Displays the same as above\n"
  1463. "echo _url('hello', 'world', 'foo', 'bar');\n"
  1464. "\n"
  1465. "?>\n"
  1466. msgstr ""
  1467. #. type: Plain text
  1468. #: en/./developers/03_Backend/05_Extensions.md:159
  1469. msgid ""
  1470. "Note: as a general rule, the shortened form (`_url()`) should be used in "
  1471. "views, while the long form (`Minz_Url::display()`) should be used in "
  1472. "controllers."
  1473. msgstr ""
  1474. #. type: Title ###
  1475. #: en/./developers/03_Backend/05_Extensions.md:160
  1476. #, no-wrap
  1477. msgid "Redirections"
  1478. msgstr ""
  1479. #. type: Plain text
  1480. #: en/./developers/03_Backend/05_Extensions.md:163
  1481. msgid ""
  1482. "It is often necessary to redirect a user to another page. To do so, the "
  1483. "`Minz_Request` class offers another useful method: `forward()`. This method "
  1484. "takes the same URL format as the one seen just before as its argument."
  1485. msgstr ""
  1486. #. type: Plain text
  1487. #: en/./developers/03_Backend/05_Extensions.md:166
  1488. #, no-wrap
  1489. msgid ""
  1490. "<?php\n"
  1491. "\n"
  1492. "$url_array = [\n"
  1493. "\t'c' => 'hello',\n"
  1494. "\t'a' => 'world',\n"
  1495. "];\n"
  1496. "\n"
  1497. "// Tells Minz to redirect the user to the hello / world page.\n"
  1498. "// Note that this is a redirection in the Minz sense of the term, not a "
  1499. "redirection that the browser will have to manage (HTTP code 301 or 302)\n"
  1500. "// The code that follows forward() will thus be executed!\n"
  1501. "Minz_Request::forward($url_array);\n"
  1502. "\n"
  1503. "// To perform a type 302 redirect, add \"true\".\n"
  1504. "// The code that follows will never be executed.\n"
  1505. "Minz_Request::forward($url_array, true);\n"
  1506. "\n"
  1507. "?>\n"
  1508. msgstr ""
  1509. #. type: Plain text
  1510. #: en/./developers/03_Backend/05_Extensions.md:187
  1511. msgid ""
  1512. "It is very common to want display a message to the user while performing a "
  1513. "redirect, to tell the user how the action was carried out (validation of a "
  1514. "form for example). Such a message is passed through a `notification` session "
  1515. "variable (note: we will talk about feedback from now on to avoid confusion "
  1516. "with a notification that can occur at any time). To facilitate this kind of "
  1517. "very frequent action, there are two shortcuts that both perform a 302 "
  1518. "redirect by assigning a feedback message:"
  1519. msgstr ""
  1520. #. type: Plain text
  1521. #: en/./developers/03_Backend/05_Extensions.md:188
  1522. #, no-wrap
  1523. msgid ""
  1524. "<?php\n"
  1525. "\n"
  1526. "$url_array = [\n"
  1527. "\t'c' => 'hello',\n"
  1528. "\t'a' => 'world',\n"
  1529. "];\n"
  1530. "$feedback_good = 'All went well!';\n"
  1531. "$feedback_bad = 'Oops, something went wrong.';\n"
  1532. "\n"
  1533. "Minz_Request::good($feedback_good, $url_array);\n"
  1534. "\n"
  1535. "// or\n"
  1536. "\n"
  1537. "Minz_Request::bad($feedback_bad, $url_array);\n"
  1538. "\n"
  1539. "?>\n"
  1540. msgstr ""
  1541. #. type: Title ###
  1542. #: en/./developers/03_Backend/05_Extensions.md:207
  1543. #, no-wrap
  1544. msgid "Translation Management"
  1545. msgstr ""
  1546. #. type: Plain text
  1547. #: en/./developers/03_Backend/05_Extensions.md:210
  1548. msgid ""
  1549. "It is common (and that's an understatement) to want to show some text to the "
  1550. "user. In the previous example, for example, we display feedback to the user "
  1551. "based on the result of form validation. The problem is that FreshRSS has "
  1552. "users of different nationalities. It is therefore necessary to be able to "
  1553. "manage different languages in order not to remain confined to English or "
  1554. "French."
  1555. msgstr ""
  1556. #. type: Plain text
  1557. #: en/./developers/03_Backend/05_Extensions.md:212
  1558. msgid ""
  1559. "The solution is to use the `Minz_Translate` class, which allows dynamic "
  1560. "translation of FreshRSS (or any Minz-based application). Before using this "
  1561. "module, it is necessary to know where to find the strings to be "
  1562. "translated. Each language has its own subdirectory in a parent directory "
  1563. "named `i18n`. For example, English language files are located in "
  1564. "`i18n/fr/`. There are seven different files:"
  1565. msgstr ""
  1566. #. type: Bullet: '* '
  1567. #: en/./developers/03_Backend/05_Extensions.md:220
  1568. msgid "`admin.php` for anything related to FreshRSS administration"
  1569. msgstr ""
  1570. #. type: Bullet: '* '
  1571. #: en/./developers/03_Backend/05_Extensions.md:220
  1572. msgid "`conf.php` for configuration"
  1573. msgstr ""
  1574. #. type: Bullet: '* '
  1575. #: en/./developers/03_Backend/05_Extensions.md:220
  1576. msgid "`feedback.php` contains translations of feedback messages"
  1577. msgstr ""
  1578. #. type: Bullet: '* '
  1579. #: en/./developers/03_Backend/05_Extensions.md:220
  1580. msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")"
  1581. msgstr ""
  1582. #. type: Bullet: '* '
  1583. #: en/./developers/03_Backend/05_Extensions.md:220
  1584. msgid "`index.php` for the main page that lists feeds and the About page"
  1585. msgstr ""
  1586. #. type: Bullet: '* '
  1587. #: en/./developers/03_Backend/05_Extensions.md:220
  1588. msgid "`install.php` contains strings related FreshRSS installation"
  1589. msgstr ""
  1590. #. type: Bullet: '* '
  1591. #: en/./developers/03_Backend/05_Extensions.md:220
  1592. msgid "`sub.php` for subscription management (sub for \"subscription\")"
  1593. msgstr ""
  1594. #. type: Plain text
  1595. #: en/./developers/03_Backend/05_Extensions.md:222
  1596. msgid "This organization makes it possible to avoid a single huge translation file."
  1597. msgstr ""
  1598. #. type: Plain text
  1599. #: en/./developers/03_Backend/05_Extensions.md:224
  1600. msgid ""
  1601. "The translation files are quite simple: it's only a matter of returning a "
  1602. "PHP table containing the translations. As an example, here's an extract from "
  1603. "`app/i18n/fr/gen.php`:"
  1604. msgstr ""
  1605. #. type: Plain text
  1606. #: en/./developers/03_Backend/05_Extensions.md:225
  1607. #, no-wrap
  1608. msgid ""
  1609. "<?php\n"
  1610. "\n"
  1611. "return array(\n"
  1612. "\t'action' => [\n"
  1613. "\t\t'actualize' => 'Actualiser',\n"
  1614. "\t\t'back_to_rss_feeds' => '← Retour à vos flux RSS',\n"
  1615. "\t\t'cancel' => 'Annuler',\n"
  1616. "\t\t'create' => 'Créer',\n"
  1617. "\t\t'disable' => 'Désactiver',\n"
  1618. "\t),\n"
  1619. "\t'freshrss' => array(\n"
  1620. "\t\t'_' => 'FreshRSS',\n"
  1621. "\t\t'about' => 'À propos de FreshRSS',\n"
  1622. "\t),\n"
  1623. "];\n"
  1624. "\n"
  1625. "?>\n"
  1626. msgstr ""
  1627. #. type: Plain text
  1628. #: en/./developers/03_Backend/05_Extensions.md:247
  1629. msgid ""
  1630. "To access these translations, `Minz_Translate` will help us with its "
  1631. "`Minz_Translate::t()` method. As this can be a bit long to type, a shortcut "
  1632. "has been introduced that **must** be used in all circumstances: `_t()`. "
  1633. "Code example:"
  1634. msgstr ""
  1635. #. type: Plain text
  1636. #: en/./developers/03_Backend/05_Extensions.md:248
  1637. #, no-wrap
  1638. msgid ""
  1639. "<p>\n"
  1640. "\t<a href=\"<?= _url('index', 'index') ?>\">\n"
  1641. "\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
  1642. "\t</a>\n"
  1643. "</p>\n"
  1644. msgstr ""
  1645. #. type: Plain text
  1646. #: en/./developers/03_Backend/05_Extensions.md:257
  1647. msgid ""
  1648. "The string to pass to the `_t()` function consists of a series of "
  1649. "identifiers separated by dots. The first identifier indicates from which "
  1650. "file to extract the translation (in this case, `gen.php`), while the "
  1651. "following ones indicate table entries. Thus `action` is an entry of the main "
  1652. "array and `back_to_rss_feeds` is an entry of the `action` array. This allows "
  1653. "us to further organize our translation files."
  1654. msgstr ""
  1655. #. type: Plain text
  1656. #: en/./developers/03_Backend/05_Extensions.md:259
  1657. msgid ""
  1658. "There is a small special case that sometimes makes life easier: the `_` "
  1659. "identifier. This must necessarily be present at the end of the chain and "
  1660. "gives a value to the higher-level identifier. It's pretty hard to explain "
  1661. "but very simple to understand. In the example given above, a `_` is "
  1662. "associated with the value `FreshRSS`: this means that there is no need to "
  1663. "write `_t('gen.freshrss._')` but `_t('gen.freshrss')` suffices."
  1664. msgstr ""
  1665. #. type: Title ###
  1666. #: en/./developers/03_Backend/05_Extensions.md:260
  1667. #, no-wrap
  1668. msgid "Configuration management"
  1669. msgstr ""
  1670. #. type: Title ##
  1671. #: en/./developers/03_Backend/05_Extensions.md:262
  1672. #, no-wrap
  1673. msgid "Write an extension for FreshRSS"
  1674. msgstr ""
  1675. #. type: Plain text
  1676. #: en/./developers/03_Backend/05_Extensions.md:265
  1677. msgid ""
  1678. "Here we are! We've talked about the most useful features of Minz and how to "
  1679. "run FreshRSS correctly and it's about time to address the extensions "
  1680. "themselves."
  1681. msgstr ""
  1682. #. type: Plain text
  1683. #: en/./developers/03_Backend/05_Extensions.md:267
  1684. msgid ""
  1685. "An extension allows you to easily add functionality to FreshRSS without "
  1686. "having to touch the core of the project directly."
  1687. msgstr ""
  1688. #. type: Title ###
  1689. #: en/./developers/03_Backend/05_Extensions.md:268
  1690. #, no-wrap
  1691. msgid "Basic files and folders"
  1692. msgstr ""
  1693. #. type: Plain text
  1694. #: en/./developers/03_Backend/05_Extensions.md:273
  1695. msgid ""
  1696. "The first thing to note is that **all** extensions **must** be located in "
  1697. "the `extensions` directory, at the base of the FreshRSS tree. An extension "
  1698. "is a directory containing a set of mandatory (and optional) files and "
  1699. "subdirectories. The convention requires that the main directory name be "
  1700. "preceded by an \"x\" to indicate that it is not an extension included by "
  1701. "default in FreshRSS."
  1702. msgstr ""
  1703. #. type: Plain text
  1704. #: en/./developers/03_Backend/05_Extensions.md:275
  1705. msgid ""
  1706. "The main directory of an extension must contain at least two **mandatory** "
  1707. "files:"
  1708. msgstr ""
  1709. #. type: Bullet: '* '
  1710. #: en/./developers/03_Backend/05_Extensions.md:278
  1711. msgid ""
  1712. "A `metadata.json` file that contains a description of the extension. This "
  1713. "file is written in JSON."
  1714. msgstr ""
  1715. #. type: Bullet: '* '
  1716. #: en/./developers/03_Backend/05_Extensions.md:278
  1717. msgid ""
  1718. "An `extension.php` file containing the entry point of the extension (which "
  1719. "is a class that inherits Minz_Extension)."
  1720. msgstr ""
  1721. #. type: Plain text
  1722. #: en/./developers/03_Backend/05_Extensions.md:282
  1723. msgid ""
  1724. "Please note that there is a not a required link between the directory name "
  1725. "of the extension and the name of the class inside `extension.php`, but you "
  1726. "should follow our best practice: If you want to write a `HelloWorld` "
  1727. "extension, the directory name should be `xExtension-HelloWorld` and the base "
  1728. "class name `HelloWorldExtension`."
  1729. msgstr ""
  1730. #. type: Plain text
  1731. #: en/./developers/03_Backend/05_Extensions.md:284
  1732. msgid ""
  1733. "In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you "
  1734. "need the structure:"
  1735. msgstr ""
  1736. #. type: Plain text
  1737. #: en/./developers/03_Backend/05_Extensions.md:284
  1738. #, no-wrap
  1739. msgid ""
  1740. "class HelloWorldExtension extends Minz_Extension {\n"
  1741. "\tpublic function init() {\n"
  1742. "\t\t// your code here\n"
  1743. "\t}\n"
  1744. "}\n"
  1745. msgstr ""
  1746. #. type: Plain text
  1747. #: en/./developers/03_Backend/05_Extensions.md:292
  1748. msgid ""
  1749. "There is an example HelloWorld extension that you can download from [our "
  1750. "GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)."
  1751. msgstr ""
  1752. #. type: Plain text
  1753. #: en/./developers/03_Backend/05_Extensions.md:294
  1754. msgid ""
  1755. "You may also need additional files or subdirectories depending on your "
  1756. "needs:"
  1757. msgstr ""
  1758. #. type: Bullet: '* '
  1759. #: en/./developers/03_Backend/05_Extensions.md:300
  1760. msgid ""
  1761. "`configure.phtml` is the file containing the form to parameterize your "
  1762. "extension"
  1763. msgstr ""
  1764. #. type: Bullet: '* '
  1765. #: en/./developers/03_Backend/05_Extensions.md:300
  1766. msgid ""
  1767. "A `static/` directory containing CSS and JavaScript files that you will need "
  1768. "for your extension (note that if you need to write a lot of CSS it may be "
  1769. "more interesting to write a complete theme)"
  1770. msgstr ""
  1771. #. type: Bullet: '* '
  1772. #: en/./developers/03_Backend/05_Extensions.md:300
  1773. msgid "A `Controllers` directory containing additional controllers"
  1774. msgstr ""
  1775. #. type: Bullet: '* '
  1776. #: en/./developers/03_Backend/05_Extensions.md:300
  1777. msgid "An `i18n` directory containing additional translations"
  1778. msgstr ""
  1779. #. type: Bullet: '* '
  1780. #: en/./developers/03_Backend/05_Extensions.md:300
  1781. msgid ""
  1782. "`layout` and` views` directories to define new views or to overwrite the "
  1783. "current views"
  1784. msgstr ""
  1785. #. type: Plain text
  1786. #: en/./developers/03_Backend/05_Extensions.md:302
  1787. msgid ""
  1788. "In addition, it is good to have a `LICENSE` file indicating the license "
  1789. "under which your extension is distributed and a` README` file giving a "
  1790. "detailed description of it."
  1791. msgstr ""
  1792. #. type: Title ###
  1793. #: en/./developers/03_Backend/05_Extensions.md:303
  1794. #, no-wrap
  1795. msgid "The metadata.json file"
  1796. msgstr ""
  1797. #. type: Plain text
  1798. #: en/./developers/03_Backend/05_Extensions.md:306
  1799. msgid ""
  1800. "The `metadata.json` file defines your extension through a number of "
  1801. "important elements. It must contain a valid JSON array containing the "
  1802. "following entries:"
  1803. msgstr ""
  1804. #. type: Bullet: '* '
  1805. #: en/./developers/03_Backend/05_Extensions.md:313
  1806. msgid "`name`: the name of your extension"
  1807. msgstr ""
  1808. #. type: Bullet: '* '
  1809. #: en/./developers/03_Backend/05_Extensions.md:313
  1810. msgid ""
  1811. "`author`: your name, your e-mail address ... but there is no specific format "
  1812. "to adopt"
  1813. msgstr ""
  1814. #. type: Bullet: '* '
  1815. #: en/./developers/03_Backend/05_Extensions.md:313
  1816. msgid "`description`: a description of your extension"
  1817. msgstr ""
  1818. #. type: Bullet: '* '
  1819. #: en/./developers/03_Backend/05_Extensions.md:313
  1820. msgid "`version`: the current version number of the extension"
  1821. msgstr ""
  1822. #. type: Bullet: '* '
  1823. #: en/./developers/03_Backend/05_Extensions.md:313
  1824. msgid ""
  1825. "`entrypoint`: Indicates the entry point of your extension. It must match the "
  1826. "name of the class contained in the file `extension.php` without the suffix` "
  1827. "Extension` (so if the entry point is `HelloWorld`, your class will be "
  1828. "called` HelloWorldExtension`)"
  1829. msgstr ""
  1830. #. type: Bullet: '* '
  1831. #: en/./developers/03_Backend/05_Extensions.md:313
  1832. msgid ""
  1833. "`type`: Defines the type of your extension. There are two types: `system` "
  1834. "and` user`. We will study this difference right after."
  1835. msgstr ""
  1836. #. type: Plain text
  1837. #: en/./developers/03_Backend/05_Extensions.md:315
  1838. msgid "Only the `name` and` entrypoint` fields are required."
  1839. msgstr ""
  1840. #. type: Title ###
  1841. #: en/./developers/03_Backend/05_Extensions.md:316
  1842. #, no-wrap
  1843. msgid "Choosing between `system` and `user`"
  1844. msgstr ""
  1845. #. type: Plain text
  1846. #: en/./developers/03_Backend/05_Extensions.md:319
  1847. msgid ""
  1848. "A __user__ extension can be enabled by some users and not by others "
  1849. "(typically for user preferences)."
  1850. msgstr ""
  1851. #. type: Plain text
  1852. #: en/./developers/03_Backend/05_Extensions.md:321
  1853. msgid "A __system__ extension in comparison is enabled for every account."
  1854. msgstr ""
  1855. #. type: Title ###
  1856. #: en/./developers/03_Backend/05_Extensions.md:322
  1857. #, no-wrap
  1858. msgid "Writing your own extension.php"
  1859. msgstr ""
  1860. #. type: Plain text
  1861. #: en/./developers/03_Backend/05_Extensions.md:327
  1862. msgid ""
  1863. "This file is the entry point of your extension. It must contain a specific "
  1864. "class to function. As mentioned above, the name of the class must be your "
  1865. "`entrypoint` suffixed by` Extension` (`HelloWorldExtension` for example). "
  1866. "In addition, this class must be inherited from the `Minz_Extension` class to "
  1867. "benefit from extensions-specific methods."
  1868. msgstr ""
  1869. #. type: Plain text
  1870. #: en/./developers/03_Backend/05_Extensions.md:329
  1871. msgid "Your class will benefit from four methods to redefine:"
  1872. msgstr ""
  1873. #. type: Bullet: '* '
  1874. #: en/./developers/03_Backend/05_Extensions.md:334
  1875. msgid ""
  1876. "`install()` is called when a user clicks the button to activate your "
  1877. "extension. It allows, for example, to update the database of a user in order "
  1878. "to make it compatible with the extension. It returns `true` if everything "
  1879. "went well or, if not, a string explaining the problem."
  1880. msgstr ""
  1881. #. type: Bullet: '* '
  1882. #: en/./developers/03_Backend/05_Extensions.md:334
  1883. msgid ""
  1884. "`uninstall()` is called when a user clicks the button to disable your "
  1885. "extension. This will allow you to undo the database changes you potentially "
  1886. "made in `install ()`. It returns `true` if everything went well or, if not, "
  1887. "a string explaining the problem."
  1888. msgstr ""
  1889. #. type: Bullet: '* '
  1890. #: en/./developers/03_Backend/05_Extensions.md:334
  1891. msgid ""
  1892. "`init()` is called for every page load *if the extension is enabled*. It "
  1893. "will therefore initialize the behavior of the extension. This is the most "
  1894. "important method."
  1895. msgstr ""
  1896. #. type: Bullet: '* '
  1897. #: en/./developers/03_Backend/05_Extensions.md:334
  1898. msgid ""
  1899. "`handleConfigureAction()` is called when a user loads the extension "
  1900. "management panel. Specifically, it is called when the "
  1901. "`?c=extension&a=configured&e=name-of-your-extension` URL is loaded. You "
  1902. "should also write here the behavior you want when validating the form in "
  1903. "your `configure.phtml` file."
  1904. msgstr ""
  1905. #. type: Plain text
  1906. #: en/./developers/03_Backend/05_Extensions.md:336
  1907. msgid ""
  1908. "In addition, you will have a number of methods directly inherited from "
  1909. "`Minz_Extension` that you should not redefine:"
  1910. msgstr ""
  1911. #. type: Bullet: '* '
  1912. #: en/./developers/03_Backend/05_Extensions.md:340
  1913. msgid ""
  1914. "The \"getters\" first: most are explicit enough not to detail them here - "
  1915. "`getName()`, `getEntrypoint()`, `getPath()` (allows you to retrieve the path "
  1916. "to your extension), `getAuthor()`, `getDescription()`, `getVersion()`, "
  1917. "`getType()`."
  1918. msgstr ""
  1919. #. type: Bullet: '* '
  1920. #: en/./developers/03_Backend/05_Extensions.md:340
  1921. msgid ""
  1922. "`getFileUrl($filename, $type)` will return the URL to a file in the `static` "
  1923. "directory. The first parameter is the name of the file (without `static /`), "
  1924. "the second is the type of file to be used (`css` or` js`)."
  1925. msgstr ""
  1926. #. type: Bullet: '* '
  1927. #: en/./developers/03_Backend/05_Extensions.md:340
  1928. msgid ""
  1929. "`registerController($base_name)` will tell Minz to take into account the "
  1930. "given controller in the routing system. The controller must be located in "
  1931. "your `Controllers` directory, the name of the file must be` "
  1932. "<base_name>Controller.php` and the name of the "
  1933. "`FreshExtension_<base_name>_Controller` class."
  1934. msgstr ""
  1935. #. type: Bullet: '* '
  1936. #: en/./developers/03_Backend/05_Extensions.md:346
  1937. msgid "`registerViews()`"
  1938. msgstr ""
  1939. #. type: Bullet: '* '
  1940. #: en/./developers/03_Backend/05_Extensions.md:346
  1941. msgid "`registerTranslates()`"
  1942. msgstr ""
  1943. #. type: Bullet: '* '
  1944. #: en/./developers/03_Backend/05_Extensions.md:346
  1945. msgid "`registerHook($hook_name, $hook_function)`"
  1946. msgstr ""
  1947. #. type: Title ###
  1948. #: en/./developers/03_Backend/05_Extensions.md:347
  1949. #, no-wrap
  1950. msgid "The \"hooks\" system"
  1951. msgstr ""
  1952. #. type: Plain text
  1953. #: en/./developers/03_Backend/05_Extensions.md:350
  1954. msgid ""
  1955. "You can register at the FreshRSS event system in an extensions `init()` "
  1956. "method, to manipulate data when some of the core functions are executed."
  1957. msgstr ""
  1958. #. type: Plain text
  1959. #: en/./developers/03_Backend/05_Extensions.md:351
  1960. #, no-wrap
  1961. msgid ""
  1962. "class HelloWorldExtension extends Minz_Extension\n"
  1963. "{\n"
  1964. "\tpublic function init() {\n"
  1965. "\t\t$this->registerHook('entry_before_display', array($this, "
  1966. "'renderEntry'));\n"
  1967. "\t}\n"
  1968. "\tpublic function renderEntry($entry) {\n"
  1969. "\t\t$entry->_content('<h1>Hello World</h1>' . $entry->content());\n"
  1970. "\t\treturn $entry;\n"
  1971. "\t}\n"
  1972. "}\n"
  1973. msgstr ""
  1974. #. type: Plain text
  1975. #: en/./developers/03_Backend/05_Extensions.md:365
  1976. msgid "The following events are available:"
  1977. msgstr ""
  1978. #. type: Bullet: '* '
  1979. #: en/./developers/03_Backend/05_Extensions.md:376
  1980. msgid ""
  1981. "`entry_before_display` (`function($entry) -> Entry | null`): will be "
  1982. "executed every time an entry is rendered. The entry itself (instance of "
  1983. "FreshRSS\\_Entry) will be passed as parameter."
  1984. msgstr ""
  1985. #. type: Bullet: '* '
  1986. #: en/./developers/03_Backend/05_Extensions.md:376
  1987. msgid ""
  1988. "`entry_before_insert` (`function($entry) -> Entry | null`): will be executed "
  1989. "when a feed is refreshed and new entries will be imported into the "
  1990. "database. The new entry (instance of FreshRSS\\_Entry) will be passed as "
  1991. "parameter."
  1992. msgstr ""
  1993. #. type: Bullet: '* '
  1994. #: en/./developers/03_Backend/05_Extensions.md:376
  1995. msgid ""
  1996. "`feed_before_insert` (`function($feed) -> Feed | null`): will be executed "
  1997. "when a new feed is imported into the database. The new feed (instance of "
  1998. "FreshRSS\\_Feed) will be passed as parameter."
  1999. msgstr ""
  2000. #. type: Bullet: '* '
  2001. #: en/./developers/03_Backend/05_Extensions.md:376
  2002. msgid ""
  2003. "`freshrss_init` (`function() -> none`): will be executed at the end of the "
  2004. "initialization of FreshRSS, useful to initialize components or to do "
  2005. "additional access checks"
  2006. msgstr ""
  2007. #. type: Bullet: '* '
  2008. #: en/./developers/03_Backend/05_Extensions.md:376
  2009. msgid ""
  2010. "`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
  2011. "\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
  2012. "class=\"item active\"><a href=\"url\">New entry</a></li>`)"
  2013. msgstr ""
  2014. #. type: Bullet: '* '
  2015. #: en/./developers/03_Backend/05_Extensions.md:376
  2016. msgid ""
  2017. "`menu_configuration_entry` (`function() -> string`): add an entry at the end "
  2018. "of the \"Configuration\" menu, the returned string must be valid HTML "
  2019. "(e.g. `<li class=\"item active\"><a href=\"url\">New entry</a></li>`)"
  2020. msgstr ""
  2021. #. type: Bullet: '* '
  2022. #: en/./developers/03_Backend/05_Extensions.md:376
  2023. msgid ""
  2024. "`menu_other_entry` (`function() -> string`): add an entry at the end of the "
  2025. "header dropdown menu (i.e. after the \"About\" entry), the returned string "
  2026. "must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
  2027. "entry</a></li>`)"
  2028. msgstr ""
  2029. #. type: Bullet: '* '
  2030. #: en/./developers/03_Backend/05_Extensions.md:376
  2031. msgid ""
  2032. "`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
  2033. "add documentation"
  2034. msgstr ""
  2035. #. type: Bullet: '* '
  2036. #: en/./developers/03_Backend/05_Extensions.md:376
  2037. msgid "`post_update` (`function(none) -> none`): **TODO** add documentation"
  2038. msgstr ""
  2039. #. type: Bullet: '* '
  2040. #: en/./developers/03_Backend/05_Extensions.md:376
  2041. msgid ""
  2042. "`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
  2043. "add documentation"
  2044. msgstr ""
  2045. #. type: Title ###
  2046. #: en/./developers/03_Backend/05_Extensions.md:377
  2047. #, no-wrap
  2048. msgid "Writing your own configure.phtml"
  2049. msgstr ""
  2050. #. type: Plain text
  2051. #: en/./developers/03_Backend/05_Extensions.md:380
  2052. msgid ""
  2053. "When you want to support user configurations for your extension or simply "
  2054. "display some information, you have to create the `configure.phtml` file."
  2055. msgstr ""
  2056. #. type: Title #
  2057. #: en/./developers/03_Running_tests.md:1
  2058. #, no-wrap
  2059. msgid "Running tests"
  2060. msgstr ""
  2061. #. type: Plain text
  2062. #: en/./developers/03_Running_tests.md:4
  2063. msgid ""
  2064. "FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be "
  2065. "merged in `master` if the tests don't pass."
  2066. msgstr ""
  2067. #. type: Title ##
  2068. #: en/./developers/03_Running_tests.md:5
  2069. #, no-wrap
  2070. msgid "Locally"
  2071. msgstr ""
  2072. #. type: Plain text
  2073. #: en/./developers/03_Running_tests.md:8
  2074. msgid ""
  2075. "As a developer, you can run the test suite on your PC easily with `make` "
  2076. "commands. You can run the test suite with:"
  2077. msgstr ""
  2078. #. type: Plain text
  2079. #: en/./developers/03_Running_tests.md:9
  2080. #, no-wrap
  2081. msgid "$ make test\n"
  2082. msgstr ""
  2083. #. type: Plain text
  2084. #: en/./developers/03_Running_tests.md:14
  2085. msgid ""
  2086. "This command downloads the PHPUnit binary and verifies its checksum. If the "
  2087. "verification fails, the file is deleted. In this case, you should [open an "
  2088. "issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let "
  2089. "maintainers know about the problem."
  2090. msgstr ""
  2091. #. type: Plain text
  2092. #: en/./developers/03_Running_tests.md:16
  2093. msgid ""
  2094. "Then, it executes PHPUnit in a Docker container. If you don't use Docker, "
  2095. "you can run the command directly with:"
  2096. msgstr ""
  2097. #. type: Plain text
  2098. #: en/./developers/03_Running_tests.md:17
  2099. #, no-wrap
  2100. msgid "$ NO_DOCKER=true make test\n"
  2101. msgstr ""
  2102. #. type: Title ##
  2103. #: en/./developers/03_Running_tests.md:21
  2104. #, no-wrap
  2105. msgid "Travis"
  2106. msgstr ""
  2107. #. type: Plain text
  2108. #: en/./developers/03_Running_tests.md:24
  2109. msgid ""
  2110. "Tests are automatically run when you open a pull request on GitHub. It is "
  2111. "done with [Travis CI](https://travis-ci.org/FreshRSS/FreshRSS/). This is "
  2112. "done to ensure there is no regressions in your code. We cannot merge a PR if "
  2113. "the tests fail so we'll ask you to fix bugs before to review your code."
  2114. msgstr ""
  2115. #. type: Plain text
  2116. #: en/./developers/03_Running_tests.md:25
  2117. msgid ""
  2118. "If you're interested in, you can take a look at [the configuration "
  2119. "file](https://github.com/FreshRSS/FreshRSS/blob/master/.travis.yml)."
  2120. msgstr ""
  2121. #. type: Title #
  2122. #: en/./developers/04_Frontend/01_View_files.md:1
  2123. #, no-wrap
  2124. msgid "The .phtml files"
  2125. msgstr ""
  2126. #. type: Title #
  2127. #: en/./developers/04_Frontend/01_View_files.md:5
  2128. #, no-wrap
  2129. msgid "Writing a URL"
  2130. msgstr ""
  2131. #. type: Title #
  2132. #: en/./developers/04_Frontend/01_View_files.md:9
  2133. #, no-wrap
  2134. msgid "Displaying an icon"
  2135. msgstr ""
  2136. #. type: Title #
  2137. #: en/./developers/04_Frontend/02_Design.md:1
  2138. #, no-wrap
  2139. msgid "Template file"
  2140. msgstr ""
  2141. #. type: Title #
  2142. #: en/./developers/04_Frontend/02_Design.md:5
  2143. #, no-wrap
  2144. msgid "Writing a new theme"
  2145. msgstr ""
  2146. #. type: Title #
  2147. #: en/./developers/04_Frontend/02_Design.md:9
  2148. #, no-wrap
  2149. msgid "Overriding icons"
  2150. msgstr ""
  2151. #. type: Title #
  2152. #: en/./developers/05_Release_new_version.md:1
  2153. #, no-wrap
  2154. msgid "Preparing the release"
  2155. msgstr ""
  2156. #. type: Plain text
  2157. #: en/./developers/05_Release_new_version.md:4
  2158. msgid ""
  2159. "In order to get as much feedback as possible before a release, it's "
  2160. "preferable to announce it on GitHub by creating a dedicated ticket ([see "
  2161. "examples] "
  2162. "(https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). "
  2163. "This should be done **at least one week in advance**."
  2164. msgstr ""
  2165. #. type: Plain text
  2166. #: en/./developers/05_Release_new_version.md:6
  2167. msgid "It's also recommended to make the announcement on mailing@freshrss.org."
  2168. msgstr ""
  2169. #. type: Title #
  2170. #: en/./developers/05_Release_new_version.md:7
  2171. #, no-wrap
  2172. msgid "Check the dev status"
  2173. msgstr ""
  2174. #. type: Plain text
  2175. #: en/./developers/05_Release_new_version.md:10
  2176. msgid ""
  2177. "Before releasing a new version of FreshRSS, you must ensure that the code is "
  2178. "stable and free of major bugs. Ideally, our tests should be automated and "
  2179. "executed before any publication."
  2180. msgstr ""
  2181. #. type: Plain text
  2182. #: en/./developers/05_Release_new_version.md:12
  2183. msgid ""
  2184. "You must also **make sure that the CHANGELOG file is up to date** with the "
  2185. "updates of the version to be released."
  2186. msgstr ""
  2187. #. type: Title #
  2188. #: en/./developers/05_Release_new_version.md:13
  2189. #, no-wrap
  2190. msgid "Git process"
  2191. msgstr ""
  2192. #. type: Plain text
  2193. #: en/./developers/05_Release_new_version.md:15
  2194. #, no-wrap
  2195. msgid ""
  2196. "$ git checkout master\n"
  2197. "$ git pull\n"
  2198. "$ vim constants.php\n"
  2199. "# Update version number x.y.y.z of FRESHRSS_VERSION\n"
  2200. "$ git commit -a\n"
  2201. "Version x.y.z\n"
  2202. "$ git tag -a x.y.z\n"
  2203. "Version x.y.z\n"
  2204. "$ git push && git push --tags\n"
  2205. msgstr ""
  2206. #. type: Title #
  2207. #: en/./developers/05_Release_new_version.md:27
  2208. #, no-wrap
  2209. msgid "Updating `update.freshrss.org`"
  2210. msgstr ""
  2211. #. type: Plain text
  2212. #: en/./developers/05_Release_new_version.md:30
  2213. msgid ""
  2214. "It's important to update update.freshrss.org since this is the default "
  2215. "service for automatic FreshRSS updates."
  2216. msgstr ""
  2217. #. type: Plain text
  2218. #: en/./developers/05_Release_new_version.md:32
  2219. msgid ""
  2220. "The repository managing the code is located on GitHub: "
  2221. "[FreshRSS/update.freshrss.org] "
  2222. "(https://github.com/FreshRSS/update.freshrss.org/)."
  2223. msgstr ""
  2224. #. type: Title ##
  2225. #: en/./developers/05_Release_new_version.md:33
  2226. #, no-wrap
  2227. msgid "Writing the update script"
  2228. msgstr ""
  2229. #. type: Plain text
  2230. #: en/./developers/05_Release_new_version.md:36
  2231. msgid ""
  2232. "The scripts are located in the `./scripts/` directory and must take the form "
  2233. "`update_to_x.y.z.z.php`. This directory also contains `update_to_dev.php` "
  2234. "intended for updates of the `master` branch (this script must not include "
  2235. "code specific to a particular version!) and `update_util.php`, which "
  2236. "contains a list of functions useful for all scripts."
  2237. msgstr ""
  2238. #. type: Plain text
  2239. #: en/./developers/05_Release_new_version.md:38
  2240. msgid ""
  2241. "In order to write a new script, it's better to copy/paste the last version "
  2242. "or to start from `update_to_dev.php`. The first thing to do is to define the "
  2243. "URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The "
  2244. "URL is in the form of "
  2245. "`https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y.z`."
  2246. msgstr ""
  2247. #. type: Plain text
  2248. #: en/./developers/05_Release_new_version.md:40
  2249. msgid "There are then 5 functions that have to be executed:"
  2250. msgstr ""
  2251. #. type: Bullet: '* '
  2252. #: en/./developers/05_Release_new_version.md:46
  2253. msgid ""
  2254. "`apply_update()` takes care of saving the directory containing the data, "
  2255. "checking its structure, downloading the FreshRSS package, deploying it and "
  2256. "cleaning it all up. This function is pre-filled but adjustments can be made "
  2257. "if necessary (e.g., reorganization of the `./data` structure). It returns "
  2258. "`true` if no problem has occurred or a string indicating a problem;"
  2259. msgstr ""
  2260. #. type: Bullet: '* '
  2261. #: en/./developers/05_Release_new_version.md:46
  2262. msgid ""
  2263. "`need_info_update()` returns `true` if the user must intervene during the "
  2264. "update or `false` if not;"
  2265. msgstr ""
  2266. #. type: Bullet: '* '
  2267. #: en/./developers/05_Release_new_version.md:46
  2268. msgid ""
  2269. "`ask_info_update()` displays a form to the user if `need_info_update()` has "
  2270. "returned `true`;"
  2271. msgstr ""
  2272. #. type: Bullet: '* '
  2273. #: en/./developers/05_Release_new_version.md:46
  2274. msgid ""
  2275. "`save_info_update()` is responsible for saving the information filled out by "
  2276. "the user (from the `ask_info_update()` form);"
  2277. msgstr ""
  2278. #. type: Bullet: '* '
  2279. #: en/./developers/05_Release_new_version.md:46
  2280. msgid ""
  2281. "`do_post_update()` is executed at the end of the update and takes into "
  2282. "account the code of the new version (e.g., if the new version changes the "
  2283. "`Minz_Configuration` object, you will benefit from these improvements)."
  2284. msgstr ""
  2285. #. type: Title ##
  2286. #: en/./developers/05_Release_new_version.md:47
  2287. #, no-wrap
  2288. msgid "Updating the versions file"
  2289. msgstr ""
  2290. #. type: Plain text
  2291. #: en/./developers/05_Release_new_version.md:50
  2292. msgid ""
  2293. "Once the script has been written and versioned, it's necessary to update the "
  2294. "`./versions.php' file which contains a mapping table indicating which "
  2295. "versions are updated to which other versions."
  2296. msgstr ""
  2297. #. type: Plain text
  2298. #: en/./developers/05_Release_new_version.md:52
  2299. msgid "Here's an example of a `versions.php` file:"
  2300. msgstr ""
  2301. #. type: Plain text
  2302. #: en/./developers/05_Release_new_version.md:53
  2303. #, no-wrap
  2304. msgid ""
  2305. "<?php\n"
  2306. "return array(\n"
  2307. "\t// STABLE\n"
  2308. "\t'0.8.0' => '1.0.0',\n"
  2309. "\t'0.8.1' => '1.0.0',\n"
  2310. "\t'1.0.0' => '1.0.1', // doesn't exist (yet)\n"
  2311. "\t// DEV\n"
  2312. "\t'1.1.2-dev' => 'dev',\n"
  2313. "\t'1.1.3-dev' => 'dev',\n"
  2314. "\t'1.1.4-dev' => 'dev',\n"
  2315. ");\n"
  2316. msgstr ""
  2317. #. type: Plain text
  2318. #: en/./developers/05_Release_new_version.md:68
  2319. msgid "And here's how this table works:"
  2320. msgstr ""
  2321. #. type: Bullet: '* '
  2322. #: en/./developers/05_Release_new_version.md:74
  2323. msgid "on the left you can find the N version, on the right the N+1 version;"
  2324. msgstr ""
  2325. #. type: Bullet: '* '
  2326. #: en/./developers/05_Release_new_version.md:74
  2327. msgid "the `x.y.z.z-dev` versions are **all** updated to `master`;"
  2328. msgstr ""
  2329. #. type: Bullet: '* '
  2330. #: en/./developers/05_Release_new_version.md:74
  2331. msgid "stable versions are updated to stable versions;"
  2332. msgstr ""
  2333. #. type: Bullet: '* '
  2334. #: en/./developers/05_Release_new_version.md:74
  2335. msgid ""
  2336. "it's possible to skip several versions at once, provided that the update "
  2337. "scripts support it;"
  2338. msgstr ""
  2339. #. type: Bullet: '* '
  2340. #: en/./developers/05_Release_new_version.md:74
  2341. msgid ""
  2342. "it's advisable to indicate the correspondence of the current version to its "
  2343. "potential future version by specifying that this version does not yet "
  2344. "exist. As long as the corresponding script does not exist, nothing will "
  2345. "happen."
  2346. msgstr ""
  2347. #. type: Plain text
  2348. #: en/./developers/05_Release_new_version.md:76
  2349. msgid ""
  2350. "It's **very strongly** recommended to keep this file organized according to "
  2351. "version numbers by separating stable and dev versions."
  2352. msgstr ""
  2353. #. type: Title ##
  2354. #: en/./developers/05_Release_new_version.md:77
  2355. #, no-wrap
  2356. msgid "Deployment"
  2357. msgstr ""
  2358. #. type: Plain text
  2359. #: en/./developers/05_Release_new_version.md:80
  2360. msgid ""
  2361. "Before updating update.freshrss.org, it's better to test with "
  2362. "dev.update.freshrss.org, which corresponds to pre-production. So update "
  2363. "dev.update.freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your "
  2364. "FreshRSS instance. Start the update and check that it's running correctly."
  2365. msgstr ""
  2366. #. type: Plain text
  2367. #: en/./developers/05_Release_new_version.md:82
  2368. msgid ""
  2369. "When you're satisfied, update update.freshrss.org with the new script, test "
  2370. "it again, and then move on."
  2371. msgstr ""
  2372. #. type: Title #
  2373. #: en/./developers/05_Release_new_version.md:83
  2374. #, no-wrap
  2375. msgid "Updating the FreshRSS services"
  2376. msgstr ""
  2377. #. type: Plain text
  2378. #: en/./developers/05_Release_new_version.md:86
  2379. msgid "Two services need to be updated immediately after the update."
  2380. msgstr ""
  2381. #. type: Bullet: '* '
  2382. #: en/./developers/05_Release_new_version.md:89
  2383. msgid "rss.freshrss.org;"
  2384. msgstr ""
  2385. #. type: Bullet: '* '
  2386. #: en/./developers/05_Release_new_version.md:89
  2387. msgid "demo.freshrss.org (public login: `demo` / `demodemo`)."
  2388. msgstr ""
  2389. #. type: Title #
  2390. #: en/./developers/05_Release_new_version.md:90
  2391. #, no-wrap
  2392. msgid "Publicly announce the release"
  2393. msgstr ""
  2394. #. type: Plain text
  2395. #: en/./developers/05_Release_new_version.md:93
  2396. msgid "When everything's working, it's time to announce the release to the world!"
  2397. msgstr ""
  2398. #. type: Bullet: '* '
  2399. #: en/./developers/05_Release_new_version.md:98
  2400. msgid ""
  2401. "on GitHub by creating[a new "
  2402. "release](https://github.com/FreshRSS/FreshRSS/releases/new)"
  2403. msgstr ""
  2404. #. type: Bullet: '* '
  2405. #: en/./developers/05_Release_new_version.md:98
  2406. msgid ""
  2407. "on the freshrss.org blog, at least for stable versions (write the article "
  2408. "on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))"
  2409. msgstr ""
  2410. #. type: Bullet: '* '
  2411. #: en/./developers/05_Release_new_version.md:98
  2412. msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)"
  2413. msgstr ""
  2414. #. type: Bullet: '* '
  2415. #: en/./developers/05_Release_new_version.md:98
  2416. msgid "and on mailing@freshrss.org"
  2417. msgstr ""
  2418. #. type: Title #
  2419. #: en/./developers/05_Release_new_version.md:99
  2420. #, no-wrap
  2421. msgid "Starting the next development version"
  2422. msgstr ""
  2423. #. type: Plain text
  2424. #: en/./developers/05_Release_new_version.md:101
  2425. #, no-wrap
  2426. msgid ""
  2427. "$ git checkout master\n"
  2428. "$ vim constants.php\n"
  2429. "# Update the FRESHRSS_VERSION\n"
  2430. "$ vim CHANGELOG.md\n"
  2431. "# Prepare the changelog for the next version\n"
  2432. "$ git add CHANGELOG.md && git commit && git push\n"
  2433. msgstr ""
  2434. #. type: Plain text
  2435. #: en/./developers/05_Release_new_version.md:110
  2436. msgid ""
  2437. "Also remember to update update.freshrss.org so that it takes the current "
  2438. "development version into account."
  2439. msgstr ""
  2440. #. type: Plain text
  2441. #: en/./index.md:2
  2442. msgid "![FreshRSS logo](img/logo_freshrss.png)"
  2443. msgstr ""
  2444. #. type: Plain text
  2445. #: en/./index.md:4
  2446. msgid ""
  2447. "FreshRSS is an RSS aggregator and reader. It allows you to read and follow "
  2448. "several news websites at a glance without the need to browse from one "
  2449. "website to another."
  2450. msgstr ""
  2451. #. type: Plain text
  2452. #: en/./index.md:6
  2453. msgid "FreshRSS has a lot of features including:"
  2454. msgstr ""
  2455. #. type: Bullet: '* '
  2456. #: en/./index.md:18
  2457. msgid "RSS and Atom aggregation"
  2458. msgstr ""
  2459. #. type: Bullet: '* '
  2460. #: en/./index.md:18
  2461. msgid "Mark article as favorite if you liked it or if you want to read it later"
  2462. msgstr ""
  2463. #. type: Bullet: '* '
  2464. #: en/./index.md:18
  2465. msgid "Filter and search functionality helps to easily find articles"
  2466. msgstr ""
  2467. #. type: Bullet: '* '
  2468. #: en/./index.md:18
  2469. msgid "Statistics to show you the publishing frequency all the websites you follow"
  2470. msgstr ""
  2471. #. type: Bullet: '* '
  2472. #: en/./index.md:18
  2473. msgid "Import/export of your feeds into OPML format"
  2474. msgstr ""
  2475. #. type: Bullet: '* '
  2476. #: en/./index.md:18
  2477. msgid "Several themes created by the community"
  2478. msgstr ""
  2479. #. type: Bullet: '* '
  2480. #: en/./index.md:18
  2481. msgid "\"Google Reader\"-like API to connect Android applications"
  2482. msgstr ""
  2483. #. type: Bullet: '* '
  2484. #: en/./index.md:18
  2485. msgid ""
  2486. "The application is \"responsive,\" which means it adapts to small screens so "
  2487. "you can bring articles in your pocket"
  2488. msgstr ""
  2489. #. type: Bullet: '* '
  2490. #: en/./index.md:18
  2491. msgid ""
  2492. "Self-hosted: the code is free (under AGPL3 licence), so you can host your "
  2493. "own instance of FreshRSS"
  2494. msgstr ""
  2495. #. type: Bullet: '* '
  2496. #: en/./index.md:18
  2497. msgid "Multi-user, so you can also host for your friends and family"
  2498. msgstr ""
  2499. #. type: Bullet: '* '
  2500. #: en/./index.md:18
  2501. msgid "And a lot more!"
  2502. msgstr ""
  2503. #. type: Plain text
  2504. #: en/./index.md:20
  2505. msgid "This documentation is split into different sections:"
  2506. msgstr ""
  2507. #. type: Bullet: '* '
  2508. #: en/./index.md:24
  2509. msgid ""
  2510. "[User documentation](./users/02_First_steps.html), where you can discover "
  2511. "all the possibilities offered by FreshRSS"
  2512. msgstr ""
  2513. #. type: Bullet: '* '
  2514. #: en/./index.md:24
  2515. msgid ""
  2516. "[Administrator documentation](./admins/01_Index.html) for detailed "
  2517. "installation and maintenance related tasks"
  2518. msgstr ""
  2519. #. type: Bullet: '* '
  2520. #: en/./index.md:24
  2521. msgid ""
  2522. "[Developer documentation](./developers/01_First_steps.html) to guide you in "
  2523. "the source code of FreshRSS and to help you if you want to contribute"
  2524. msgstr ""
  2525. #. type: Bullet: '* '
  2526. #: en/./index.md:24
  2527. msgid ""
  2528. "[Contributor guidelines](./contributing.md) for those who want to help "
  2529. "improve FreshRSS"
  2530. msgstr ""
  2531. #. type: Plain text
  2532. #: en/./users/02_First_steps.md:2
  2533. msgid ""
  2534. "Learning how to handle a new application is not always easy. We've tried to "
  2535. "make FreshRSS as intuitive as possible, but you might still need a little "
  2536. "help to master the program."
  2537. msgstr ""
  2538. #. type: Plain text
  2539. #: en/./users/02_First_steps.md:4
  2540. msgid ""
  2541. "This section will guide you to the pages you need to get started. The order "
  2542. "is tailored to newcomers."
  2543. msgstr ""
  2544. #. type: Plain text
  2545. #: en/./users/02_First_steps.md:6
  2546. msgid ""
  2547. "[After installing the application](../admins/03_Installation.md), the first "
  2548. "step is to add some feeds. You have a few options:"
  2549. msgstr ""
  2550. #. type: Bullet: '1. '
  2551. #: en/./users/02_First_steps.md:10
  2552. msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)"
  2553. msgstr ""
  2554. #. type: Bullet: '2. '
  2555. #: en/./users/02_First_steps.md:10
  2556. msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)"
  2557. msgstr ""
  2558. #. type: Bullet: '3. '
  2559. #: en/./users/02_First_steps.md:10
  2560. msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)"
  2561. msgstr ""
  2562. #. type: Plain text
  2563. #: en/./users/02_First_steps.md:12
  2564. msgid ""
  2565. "Once you have added your feeds to FreshRSS, it is time to read them. There "
  2566. "are three availalbe reading modes:"
  2567. msgstr ""
  2568. #. type: Bullet: '1. '
  2569. #: en/./users/02_First_steps.md:16
  2570. msgid ""
  2571. "[The normal view](03_Main_view.md#normal-view) enables you to quickly read "
  2572. "new articles"
  2573. msgstr ""
  2574. #. type: Bullet: '2. '
  2575. #: en/./users/02_First_steps.md:16
  2576. msgid ""
  2577. "[The global view](03_Main_view.md#global-view) shows you an overview of the "
  2578. "status of your feeds in one glance"
  2579. msgstr ""
  2580. #. type: Bullet: '3. '
  2581. #: en/./users/02_First_steps.md:16
  2582. msgid ""
  2583. "[The reader view](03_Main_view.md#reader-view) offers you a comfortable "
  2584. "reading experience"
  2585. msgstr ""
  2586. #. type: Plain text
  2587. #: en/./users/02_First_steps.md:18
  2588. msgid ""
  2589. "Now that you've mastered basic use, it's time to configure FreshRSS to "
  2590. "improve your reading experience. It's highly configurable, so it's "
  2591. "recommended to play around with them to find a configuration that suits you "
  2592. "well. Here are a few resources to help you improve your daily FreshRSS "
  2593. "experience:"
  2594. msgstr ""
  2595. #. type: Bullet: '* '
  2596. #: en/./users/02_First_steps.md:27
  2597. msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)"
  2598. msgstr ""
  2599. #. type: Bullet: '* '
  2600. #: en/./users/02_First_steps.md:27
  2601. msgid "[Change the home page](05_Configuration.md#changing-the-view)"
  2602. msgstr ""
  2603. #. type: Bullet: '* '
  2604. #: en/./users/02_First_steps.md:27
  2605. msgid "[Choose the reading options](05_Configuration.md#reading-options)"
  2606. msgstr ""
  2607. #. type: Bullet: '* '
  2608. #: en/./users/02_First_steps.md:27
  2609. msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)"
  2610. msgstr ""
  2611. #. type: Bullet: '* '
  2612. #: en/./users/02_First_steps.md:27
  2613. msgid ""
  2614. "[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a "
  2615. "selection"
  2616. msgstr ""
  2617. #. type: Bullet: '* '
  2618. #: en/./users/02_First_steps.md:27
  2619. msgid ""
  2620. "[Search an article](03_Main_view.md#searching-articles) published some time "
  2621. "ago"
  2622. msgstr ""
  2623. #. type: Bullet: '* '
  2624. #: en/./users/02_First_steps.md:27
  2625. msgid "[Access your feeds on a mobile device](06_Mobile_access.md)"
  2626. msgstr ""
  2627. #. type: Bullet: '* '
  2628. #: en/./users/02_First_steps.md:27
  2629. msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)"
  2630. msgstr ""
  2631. #. type: Bullet: '* '
  2632. #: en/./users/02_First_steps.md:27
  2633. msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
  2634. msgstr ""
  2635. #. type: Title #
  2636. #: en/./users/03_Main_view.md:1
  2637. #, no-wrap
  2638. msgid "Normal view"
  2639. msgstr ""
  2640. #. type: Title #
  2641. #: en/./users/03_Main_view.md:5
  2642. #, no-wrap
  2643. msgid "Global view"
  2644. msgstr ""
  2645. #. type: Title #
  2646. #: en/./users/03_Main_view.md:9
  2647. #, no-wrap
  2648. msgid "Reader view"
  2649. msgstr ""
  2650. #. type: Title #
  2651. #: en/./users/03_Main_view.md:13
  2652. #, no-wrap
  2653. msgid "Refreshing feeds"
  2654. msgstr ""
  2655. #. type: Plain text
  2656. #: en/./users/03_Main_view.md:16
  2657. msgid ""
  2658. "To take full advantage of FreshRSS, it needs to retrieve new items from the "
  2659. "feeds you have subscribed to. There are several ways to do this."
  2660. msgstr ""
  2661. #. type: Title ##
  2662. #: en/./users/03_Main_view.md:17
  2663. #, no-wrap
  2664. msgid "Automatic update"
  2665. msgstr ""
  2666. #. type: Plain text
  2667. #: en/./users/03_Main_view.md:20
  2668. msgid ""
  2669. "This is the recommended method since you can forget about it once it is "
  2670. "configured."
  2671. msgstr ""
  2672. #. type: Title ###
  2673. #: en/./users/03_Main_view.md:21
  2674. #, no-wrap
  2675. msgid "With the actualize_script.php script"
  2676. msgstr ""
  2677. #. type: Plain text
  2678. #: en/./users/03_Main_view.md:24
  2679. msgid ""
  2680. "This method is only available if you have access to the scheduled tasks of "
  2681. "the machine on which your FreshRSS instance is installed."
  2682. msgstr ""
  2683. #. type: Plain text
  2684. #: en/./users/03_Main_view.md:26
  2685. msgid ""
  2686. "The script is named *actualize_script.php* and is located in the *app* "
  2687. "folder. The scheduled task syntax will not be explained here. However, here "
  2688. "is [a quick introduction to "
  2689. "crontab](http://www.adminschoice.com/crontab-quick-reference/) that might "
  2690. "help you."
  2691. msgstr ""
  2692. #. type: Plain text
  2693. #: en/./users/03_Main_view.md:28
  2694. msgid "Here is an example to trigger article update every hour."
  2695. msgstr ""
  2696. #. type: Code fence info string
  2697. #: en/./users/03_Main_view.md:29 en/./users/03_Main_view.md:61 en/./users/03_Main_view.md:79 en/./users/03_Main_view.md:85 en/./users/03_Main_view.md:93
  2698. #, no-wrap
  2699. msgid "cron"
  2700. msgstr ""
  2701. #. type: Plain text
  2702. #: en/./users/03_Main_view.md:29
  2703. #, no-wrap
  2704. msgid ""
  2705. "0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log "
  2706. "2>&1\n"
  2707. msgstr ""
  2708. #. type: Plain text
  2709. #: en/./users/03_Main_view.md:34
  2710. msgid "Special parameters to configure the script - all parameters can be combined:"
  2711. msgstr ""
  2712. #. type: Plain text
  2713. #: en/./users/03_Main_view.md:38
  2714. msgid ""
  2715. "- Parameter \"force\" "
  2716. "https://freshrss.example.net/i/?c=feed&a=actualize&force=1 If *force* is set "
  2717. "to 1 all feeds will be refreshed at once."
  2718. msgstr ""
  2719. #. type: Plain text
  2720. #: en/./users/03_Main_view.md:42
  2721. msgid ""
  2722. "- Parameter \"ajax\" "
  2723. "https://freshrss.example.net/i/?c=feed&a=actualize&ajax=1 Only a status site "
  2724. "is returned and not a complete website. Example: \"OK\""
  2725. msgstr ""
  2726. #. type: Plain text
  2727. #: en/./users/03_Main_view.md:46
  2728. msgid ""
  2729. "- Parameter \"maxFeeds\" "
  2730. "https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=30 If *maxFeeds* "
  2731. "is set the configured amount of feeds is refreshed at once. The default "
  2732. "setting is \"10\"."
  2733. msgstr ""
  2734. #. type: Plain text
  2735. #: en/./users/03_Main_view.md:50
  2736. msgid ""
  2737. "- Parameter \"token\" "
  2738. "https://freshrss.example.net/i/?c=feed&a=actualize&token=542345872345734 "
  2739. "Security parameter to prevent unauthorized refreshes. For detailed "
  2740. "Documentation see \"Form authentication\"."
  2741. msgstr ""
  2742. #. type: Title ###
  2743. #: en/./users/03_Main_view.md:51
  2744. #, no-wrap
  2745. msgid "Online cron"
  2746. msgstr ""
  2747. #. type: Plain text
  2748. #: en/./users/03_Main_view.md:54
  2749. msgid ""
  2750. "If you do not have access to the installation server scheduled task, you can "
  2751. "still automate the update process."
  2752. msgstr ""
  2753. #. type: Plain text
  2754. #: en/./users/03_Main_view.md:56
  2755. msgid ""
  2756. "To do so, you need to create a scheduled task, which need to call a specific "
  2757. "URL: https://freshrss.example.net/i/?c=feed&a=actualize (it could be "
  2758. "different depending on your installation). Depending on your application "
  2759. "authentication method, you need to adapt the scheduled task."
  2760. msgstr ""
  2761. #. type: Title ####
  2762. #: en/./users/03_Main_view.md:57
  2763. #, no-wrap
  2764. msgid "No authentication"
  2765. msgstr ""
  2766. #. type: Plain text
  2767. #: en/./users/03_Main_view.md:60
  2768. msgid ""
  2769. "This is the most straightforward since you have a public instance; there is "
  2770. "nothing special to configure:"
  2771. msgstr ""
  2772. #. type: Plain text
  2773. #: en/./users/03_Main_view.md:61
  2774. #, no-wrap
  2775. msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
  2776. msgstr ""
  2777. #. type: Title ###
  2778. #: en/./users/03_Main_view.md:65
  2779. #, no-wrap
  2780. msgid "Form authentication"
  2781. msgstr ""
  2782. #. type: Plain text
  2783. #: en/./users/03_Main_view.md:68
  2784. msgid ""
  2785. "If you configure the application to allow anonymous reading, you can also "
  2786. "allow anonymous users to update feeds (“Allow anonymous refresh of the "
  2787. "articles”)."
  2788. msgstr ""
  2789. #. type: Plain text
  2790. #: en/./users/03_Main_view.md:70
  2791. msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
  2792. msgstr ""
  2793. #. type: Plain text
  2794. #: en/./users/03_Main_view.md:72
  2795. msgid ""
  2796. "The URL used in the previous section will now become accessible to "
  2797. "anyone. Therefore you can use the same syntax for the scheduled task."
  2798. msgstr ""
  2799. #. type: Plain text
  2800. #: en/./users/03_Main_view.md:74
  2801. msgid ""
  2802. "You can also configure an authentication token to grant special access on "
  2803. "the server."
  2804. msgstr ""
  2805. #. type: Plain text
  2806. #: en/./users/03_Main_view.md:76
  2807. msgid "![Token configuration](../img/users/token.1.png)"
  2808. msgstr ""
  2809. #. type: Plain text
  2810. #: en/./users/03_Main_view.md:78
  2811. msgid "The scheduled task syntax should look as follows:"
  2812. msgstr ""
  2813. #. type: Plain text
  2814. #: en/./users/03_Main_view.md:79
  2815. #, no-wrap
  2816. msgid ""
  2817. "0 * * * * curl "
  2818. "'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token'\n"
  2819. msgstr ""
  2820. #. type: Plain text
  2821. #: en/./users/03_Main_view.md:84
  2822. msgid ""
  2823. "You can also target a different user by adding their username to the query "
  2824. "string, with `&user=insert-username`:"
  2825. msgstr ""
  2826. #. type: Plain text
  2827. #: en/./users/03_Main_view.md:85
  2828. #, no-wrap
  2829. msgid ""
  2830. "0 * * * * curl "
  2831. "'https://freshrss.example.net/i/?c=feed&a=actualize&user=someone&token=my-token'\n"
  2832. msgstr ""
  2833. #. type: Title ###
  2834. #: en/./users/03_Main_view.md:89
  2835. #, no-wrap
  2836. msgid "HTTP authentication"
  2837. msgstr ""
  2838. #. type: Plain text
  2839. #: en/./users/03_Main_view.md:92
  2840. msgid ""
  2841. "When using HTTP authentication, the syntax in the two previous sections is "
  2842. "unusable. You'll need to provide your credentials to the scheduled "
  2843. "task. **Note that this method is highly discouraged since it means that your "
  2844. "credentials will be in plain sight!**"
  2845. msgstr ""
  2846. #. type: Plain text
  2847. #: en/./users/03_Main_view.md:93
  2848. #, no-wrap
  2849. msgid ""
  2850. "0 * * * * curl -u alice:password123 "
  2851. "'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
  2852. msgstr ""
  2853. #. type: Title ##
  2854. #: en/./users/03_Main_view.md:97
  2855. #, no-wrap
  2856. msgid "Manual update"
  2857. msgstr ""
  2858. #. type: Plain text
  2859. #: en/./users/03_Main_view.md:100
  2860. msgid ""
  2861. "If you can't or don't want to use the automatic method, you can update "
  2862. "manually. There are two methods for updating all or some of the feeds."
  2863. msgstr ""
  2864. #. type: Title ###
  2865. #: en/./users/03_Main_view.md:101
  2866. #, no-wrap
  2867. msgid "Complete update"
  2868. msgstr ""
  2869. #. type: Plain text
  2870. #: en/./users/03_Main_view.md:104
  2871. msgid ""
  2872. "This update occurs on all feeds. To trigger it, simply click on the update "
  2873. "link in the navigation menu."
  2874. msgstr ""
  2875. #. type: Plain text
  2876. #: en/./users/03_Main_view.md:106
  2877. msgid "![Navigation menu](../img/users/refresh.1.png)"
  2878. msgstr ""
  2879. #. type: Plain text
  2880. #: en/./users/03_Main_view.md:108
  2881. msgid ""
  2882. "When the update starts, a progress bar appears and changes while feeds are "
  2883. "processed."
  2884. msgstr ""
  2885. #. type: Plain text
  2886. #: en/./users/03_Main_view.md:110
  2887. msgid "![Progress bar](../img/users/refresh.5.png)"
  2888. msgstr ""
  2889. #. type: Title ###
  2890. #: en/./users/03_Main_view.md:111
  2891. #, no-wrap
  2892. msgid "Partial update"
  2893. msgstr ""
  2894. #. type: Plain text
  2895. #: en/./users/03_Main_view.md:114
  2896. msgid ""
  2897. "This update occurs on the selected feed only. To trigger it, simply click on "
  2898. "the update link in the feed menu."
  2899. msgstr ""
  2900. #. type: Plain text
  2901. #: en/./users/03_Main_view.md:116
  2902. msgid "![Feed menu](../img/users/refresh.2.png)"
  2903. msgstr ""
  2904. #. type: Title #
  2905. #: en/./users/03_Main_view.md:117
  2906. #, no-wrap
  2907. msgid "Filtering articles"
  2908. msgstr ""
  2909. #. type: Plain text
  2910. #: en/./users/03_Main_view.md:120
  2911. msgid ""
  2912. "When the number of articles stored by FreshRSS inevitably grows larger, it's "
  2913. "important to use efficient filters to display only a subset of the "
  2914. "articles. There are several methods that filter with different "
  2915. "criteria. Usually those methods can be combined."
  2916. msgstr ""
  2917. #. type: Title ##
  2918. #: en/./users/03_Main_view.md:121
  2919. #, no-wrap
  2920. msgid "By category"
  2921. msgstr ""
  2922. #. type: Plain text
  2923. #: en/./users/03_Main_view.md:124
  2924. msgid ""
  2925. "This is the easiest method. You only need to click on the category title in "
  2926. "the side panel. There are two special categories at the top of the panel:"
  2927. msgstr ""
  2928. #. type: Bullet: ' * '
  2929. #: en/./users/03_Main_view.md:127
  2930. msgid ""
  2931. "*Main feed* displays only articles from feeds marked as available in that "
  2932. "category"
  2933. msgstr ""
  2934. #. type: Bullet: ' * '
  2935. #: en/./users/03_Main_view.md:127
  2936. msgid "*Favourites* displays only articles marked as favourites"
  2937. msgstr ""
  2938. #. type: Title ##
  2939. #: en/./users/03_Main_view.md:128
  2940. #, no-wrap
  2941. msgid "By feed"
  2942. msgstr ""
  2943. #. type: Plain text
  2944. #: en/./users/03_Main_view.md:131
  2945. msgid "There are several methods to filter articles by feed:"
  2946. msgstr ""
  2947. #. type: Bullet: ' * '
  2948. #: en/./users/03_Main_view.md:136
  2949. msgid "by clicking the feed title in the side panel"
  2950. msgstr ""
  2951. #. type: Bullet: ' * '
  2952. #: en/./users/03_Main_view.md:136
  2953. msgid "by clicking the feed title in the article details"
  2954. msgstr ""
  2955. #. type: Bullet: ' * '
  2956. #: en/./users/03_Main_view.md:136
  2957. msgid "by filtering in the feed options from the side panel"
  2958. msgstr ""
  2959. #. type: Bullet: ' * '
  2960. #: en/./users/03_Main_view.md:136
  2961. msgid "by filtering in the feed configuration"
  2962. msgstr ""
  2963. #. type: Plain text
  2964. #: en/./users/03_Main_view.md:138
  2965. msgid "![Feed filter](../img/users/feed.filter.1.png)"
  2966. msgstr ""
  2967. #. type: Title ##
  2968. #: en/./users/03_Main_view.md:139
  2969. #, no-wrap
  2970. msgid "By status"
  2971. msgstr ""
  2972. #. type: Plain text
  2973. #: en/./users/03_Main_view.md:142
  2974. msgid ""
  2975. "Each article has two attributes that can be combined. The first attribute "
  2976. "indicates whether or not the article has been read. The second attribute "
  2977. "indicates if the article was marked as favorite or not."
  2978. msgstr ""
  2979. #. type: Plain text
  2980. #: en/./users/03_Main_view.md:144
  2981. msgid ""
  2982. "In version 0.7, attribute filters are available in the article display "
  2983. "dropdown list. With this version, it's not possible to combine filters. For "
  2984. "instance, it's not possible to display only read and favorite articles."
  2985. msgstr ""
  2986. #. type: Plain text
  2987. #: en/./users/03_Main_view.md:146
  2988. msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
  2989. msgstr ""
  2990. #. type: Plain text
  2991. #: en/./users/03_Main_view.md:148
  2992. msgid ""
  2993. "Starting with version 0.8, all attribute filters are visible as toggle "
  2994. "icons. They can be combined. As any combination is possible, some have the "
  2995. "same result. For instance, the result for all filters selected is the same "
  2996. "as no filter selected."
  2997. msgstr ""
  2998. #. type: Plain text
  2999. #: en/./users/03_Main_view.md:150
  3000. msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
  3001. msgstr ""
  3002. #. type: Plain text
  3003. #: en/./users/03_Main_view.md:152
  3004. msgid "By default, this filter displays only unread articles"
  3005. msgstr ""
  3006. #. type: Title ##
  3007. #: en/./users/03_Main_view.md:153
  3008. #, no-wrap
  3009. msgid "By content"
  3010. msgstr ""
  3011. #. type: Plain text
  3012. #: en/./users/03_Main_view.md:156
  3013. msgid ""
  3014. "It is possible to filter articles by their content by inputting a string in "
  3015. "the search field."
  3016. msgstr ""
  3017. #. type: Title ##
  3018. #: en/./users/03_Main_view.md:157
  3019. #, no-wrap
  3020. msgid "With the search field"
  3021. msgstr ""
  3022. #. type: Plain text
  3023. #: en/./users/03_Main_view.md:160
  3024. msgid "You can use the search field to further refine results:"
  3025. msgstr ""
  3026. #. type: Bullet: '* '
  3027. #: en/./users/03_Main_view.md:199
  3028. msgid "by author: `author:name` or `author:'composed name'`"
  3029. msgstr ""
  3030. #. type: Bullet: '* '
  3031. #: en/./users/03_Main_view.md:199
  3032. msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
  3033. msgstr ""
  3034. #. type: Bullet: '* '
  3035. #: en/./users/03_Main_view.md:199
  3036. msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
  3037. msgstr ""
  3038. #. type: Bullet: '* '
  3039. #: en/./users/03_Main_view.md:199
  3040. msgid "by tag: `#tag`"
  3041. msgstr ""
  3042. #. type: Bullet: '* '
  3043. #: en/./users/03_Main_view.md:199
  3044. msgid "by free-text: `keyword` or `'composed keyword'`"
  3045. msgstr ""
  3046. #. type: Plain text
  3047. #: en/./users/03_Main_view.md:199
  3048. #, no-wrap
  3049. msgid ""
  3050. "* by date of discovery, using the [ISO 8601 time interval "
  3051. "format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): "
  3052. "`date:<date-interval>`\n"
  3053. "\t* From a specific day, or month, or year:\n"
  3054. "\t\t* `date:2014-03-30`\n"
  3055. "\t\t* `date:2014-03` or `date:201403`\n"
  3056. "\t\t* `date:2014`\n"
  3057. "\t* From a specific time of a given day:\n"
  3058. "\t\t* `date:2014-05-30T13`\n"
  3059. "\t\t* `date:2014-05-30T13:30`\n"
  3060. "\t* Between two given dates:\n"
  3061. "\t\t* `date:2014-02/2014-04`\n"
  3062. "\t\t* `date:2014-02--2014-04`\n"
  3063. "\t\t* `date:2014-02/04`\n"
  3064. "\t\t* `date:2014-02-03/05`\n"
  3065. "\t\t* `date:2014-02-03T22:00/22:15`\n"
  3066. "\t\t* `date:2014-02-03T22:00/15`\n"
  3067. "\t* After a given date:\n"
  3068. "\t\t* `date:2014-03/`\n"
  3069. "\t* Before a given date:\n"
  3070. "\t\t* `date:/2014-03`\n"
  3071. "\t* For a specific duration after a given date:\n"
  3072. "\t\t* `date:2014-03/P1W`\n"
  3073. "\t* For a specific duration before a given date:\n"
  3074. "\t\t* `date:P1W/2014-05-25T23:59:59`\n"
  3075. "\t* For the past duration before now (the trailing slash is optional):\n"
  3076. "\t\t* `date:P1Y/` or `date:P1Y` (past year)\n"
  3077. "\t\t* `date:P2M/` (past two months)\n"
  3078. "\t\t* `date:P3W/` (past three weeks)\n"
  3079. "\t\t* `date:P4D/` (past four days)\n"
  3080. "\t\t* `date:PT5H/` (past five hours)\n"
  3081. "\t\t* `date:PT30M/` (past thirty minutes)\n"
  3082. "\t\t* `date:PT90S/` (past ninety seconds)\n"
  3083. "\t\t* `date:P1DT1H/` (past one day and one hour)\n"
  3084. "* by date of publication, using the same format: `pubdate:<date-interval>`\n"
  3085. msgstr ""
  3086. #. type: Plain text
  3087. #: en/./users/03_Main_view.md:201
  3088. msgid "Be careful not to enter a space between the operator and the search value."
  3089. msgstr ""
  3090. #. type: Plain text
  3091. #: en/./users/03_Main_view.md:204
  3092. msgid ""
  3093. "Some operators can be used negatively, to exclude articles, with the same "
  3094. "syntax as above, but prefixed by a `!` or `-`: `-author:name`, "
  3095. "`-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
  3096. msgstr ""
  3097. #. type: Plain text
  3098. #: en/./users/03_Main_view.md:206
  3099. msgid ""
  3100. "It is also possible to combine keywords to create a more precise filter. For "
  3101. "example, you can enter multiple instances of `author:`, `intitle:`, "
  3102. "`inurl:`, `#`, and free-text."
  3103. msgstr ""
  3104. #. type: Plain text
  3105. #: en/./users/03_Main_view.md:208
  3106. msgid ""
  3107. "Combining several search criteria implies a logical *and*, but the keyword ` "
  3108. "OR ` can be used to combine several search criteria with a logical *or* "
  3109. "instead: `author:Dupont OR author:Dupond`"
  3110. msgstr ""
  3111. #. type: Title #
  3112. #: en/./users/04_Subscriptions.md:1
  3113. #, no-wrap
  3114. msgid "Adding a feed"
  3115. msgstr ""
  3116. #. type: Title #
  3117. #: en/./users/04_Subscriptions.md:5
  3118. #, no-wrap
  3119. msgid "Import and export"
  3120. msgstr ""
  3121. #. type: Title #
  3122. #: en/./users/04_Subscriptions.md:9
  3123. #, no-wrap
  3124. msgid "Use bookmarklet"
  3125. msgstr ""
  3126. #. type: Plain text
  3127. #: en/./users/04_Subscriptions.md:12
  3128. msgid ""
  3129. "Bookmarklets are little scripts that you can execute to perform various "
  3130. "tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
  3131. msgstr ""
  3132. #. type: Bullet: ' 1. '
  3133. #: en/./users/04_Subscriptions.md:16
  3134. msgid "Open \"Subscriptions management\"."
  3135. msgstr ""
  3136. #. type: Bullet: ' 2. '
  3137. #: en/./users/04_Subscriptions.md:16
  3138. msgid "Click on \"Subscription tools\"."
  3139. msgstr ""
  3140. #. type: Bullet: ' 3. '
  3141. #: en/./users/04_Subscriptions.md:16
  3142. msgid ""
  3143. "Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
  3144. "choose your browser's \"Bookmark link\" action."
  3145. msgstr ""
  3146. #. type: Title #
  3147. #: en/./users/04_Subscriptions.md:17
  3148. #, no-wrap
  3149. msgid "Feed management"
  3150. msgstr ""
  3151. #. type: Title #
  3152. #: en/./users/05_Configuration.md:2
  3153. #, no-wrap
  3154. msgid "Display"
  3155. msgstr ""
  3156. #. type: Title ##
  3157. #: en/./users/05_Configuration.md:4
  3158. #, no-wrap
  3159. msgid "Language"
  3160. msgstr ""
  3161. #. type: Plain text
  3162. #: en/./users/05_Configuration.md:9
  3163. msgid ""
  3164. "FreshRSS is currently available in 14 languages. After confirming your "
  3165. "choice, the interface will be displayed in your preferred language. "
  3166. "Depending on the language chosen, parts of the interface may not be not "
  3167. "translated yet. If you're willing to help translate the missing bits or "
  3168. "would like to add a new language, please take a look at how you can "
  3169. "[contribute to the "
  3170. "project](../contributing.md#contribute-to-internationalization-i18n)."
  3171. msgstr ""
  3172. #. type: Plain text
  3173. #: en/./users/05_Configuration.md:11
  3174. msgid ""
  3175. "Some parts of FreshRSS aren't translated and aren't intended to be "
  3176. "translated either. For now, this includes the logs visible in the "
  3177. "application as well as the log generated by automatic update scripts."
  3178. msgstr ""
  3179. #. type: Plain text
  3180. #: en/./users/05_Configuration.md:13
  3181. msgid ""
  3182. "Available languages are: cz, de, en, es, fr, he, it, kr, nl, oc, pt-br, ru, "
  3183. "tr, zh-cn."
  3184. msgstr ""
  3185. #. type: Title ##
  3186. #: en/./users/05_Configuration.md:14
  3187. #, no-wrap
  3188. msgid "Theme"
  3189. msgstr ""
  3190. #. type: Plain text
  3191. #: en/./users/05_Configuration.md:17
  3192. msgid ""
  3193. "There's no accounting for tastes, which is why FreshRSS offers eight "
  3194. "official themes:"
  3195. msgstr ""
  3196. #. type: Bullet: ' * '
  3197. #: en/./users/05_Configuration.md:26
  3198. msgid "*Blue Lagoon* by **Mister aiR**"
  3199. msgstr ""
  3200. #. type: Bullet: ' * '
  3201. #: en/./users/05_Configuration.md:26
  3202. msgid "*Dark* by **AD**"
  3203. msgstr ""
  3204. #. type: Bullet: ' * '
  3205. #: en/./users/05_Configuration.md:26
  3206. msgid "*Flat design* by **Marien Fressinaud**"
  3207. msgstr ""
  3208. #. type: Bullet: ' * '
  3209. #: en/./users/05_Configuration.md:26
  3210. msgid "*Origine* by **Marien Fressinaud**"
  3211. msgstr ""
  3212. #. type: Bullet: ' * '
  3213. #: en/./users/05_Configuration.md:26
  3214. msgid "*Origine-compact* by **Kevin Papst**"
  3215. msgstr ""
  3216. #. type: Bullet: ' * '
  3217. #: en/./users/05_Configuration.md:26
  3218. msgid "*Pafat* by **Plopoyop**"
  3219. msgstr ""
  3220. #. type: Bullet: ' * '
  3221. #: en/./users/05_Configuration.md:26
  3222. msgid "*Screwdriver* by **Mister aiR**"
  3223. msgstr ""
  3224. #. type: Bullet: ' * '
  3225. #: en/./users/05_Configuration.md:26
  3226. msgid "*Swage* by **Patrick Crandol**"
  3227. msgstr ""
  3228. #. type: Plain text
  3229. #: en/./users/05_Configuration.md:28
  3230. msgid ""
  3231. "If you can't find any themes you like, it's always possible to [create your "
  3232. "own](../developers/04_Frontend/02_Design.md)."
  3233. msgstr ""
  3234. #. type: Plain text
  3235. #: en/./users/05_Configuration.md:30
  3236. msgid ""
  3237. "To select a theme, simply scroll through the themes and select one that "
  3238. "strikes your fancy. After confirmation, the theme will be applied to the "
  3239. "interface."
  3240. msgstr ""
  3241. #. type: Title ##
  3242. #: en/./users/05_Configuration.md:31
  3243. #, no-wrap
  3244. msgid "Content width"
  3245. msgstr ""
  3246. #. type: Plain text
  3247. #: en/./users/05_Configuration.md:34
  3248. msgid ""
  3249. "Some people prefer short lines of text, while others prefer to maximize the "
  3250. "available screen space. To satisfy the maximum number of people, it's "
  3251. "possible to customize the width of the displayed content. There are four "
  3252. "settings available:"
  3253. msgstr ""
  3254. #. type: Bullet: ' * '
  3255. #: en/./users/05_Configuration.md:39
  3256. msgid "**Fine** displays content up to a maximum width of 550 pixels"
  3257. msgstr ""
  3258. #. type: Bullet: ' * '
  3259. #: en/./users/05_Configuration.md:39
  3260. msgid "**Medium** displays content up to a maximum width of 800 pixels"
  3261. msgstr ""
  3262. #. type: Bullet: ' * '
  3263. #: en/./users/05_Configuration.md:39
  3264. msgid "**Large** displays content up to a maximum width of 1000 pixels"
  3265. msgstr ""
  3266. #. type: Bullet: ' * '
  3267. #: en/./users/05_Configuration.md:39
  3268. msgid "**No limit** displays the content on 100% of the available space"
  3269. msgstr ""
  3270. #. type: Title ##
  3271. #: en/./users/05_Configuration.md:40
  3272. #, no-wrap
  3273. msgid "Article icons"
  3274. msgstr ""
  3275. #. type: Plain text
  3276. #: en/./users/05_Configuration.md:43
  3277. msgid "Please note that this section only affects normal view."
  3278. msgstr ""
  3279. #. type: Plain text
  3280. #: en/./users/05_Configuration.md:45
  3281. msgid "![Article icons configuration](../img/users/configuration.article.icons.png)"
  3282. msgstr ""
  3283. #. type: Plain text
  3284. #: en/./users/05_Configuration.md:48
  3285. msgid ""
  3286. "Each article is rendered with a header (top line) and a footer (bottom "
  3287. "line). In that section, you can choose what will be displayed in those."
  3288. msgstr ""
  3289. #. type: Plain text
  3290. #: en/./users/05_Configuration.md:52
  3291. msgid ""
  3292. "If you disable every item in the top line, you'll still be able to see it "
  3293. "since it contains the feed name and the article title. But if you do the "
  3294. "same thing for the bottom line, it will be empty."
  3295. msgstr ""
  3296. #. type: Title ##
  3297. #: en/./users/05_Configuration.md:53
  3298. #, no-wrap
  3299. msgid "HTML5 notification timout"
  3300. msgstr ""
  3301. #. type: Plain text
  3302. #: en/./users/05_Configuration.md:56
  3303. msgid ""
  3304. "After automatically updating the feeds, FreshRSS can pop up a notification "
  3305. "using the HTML5 notification API."
  3306. msgstr ""
  3307. #. type: Plain text
  3308. #: en/./users/05_Configuration.md:58
  3309. msgid "The duration of this notification can be set. By default, the value is 0."
  3310. msgstr ""
  3311. #. type: Title ##
  3312. #: en/./users/05_Configuration.md:59
  3313. #, no-wrap
  3314. msgid "Show the navigation button"
  3315. msgstr ""
  3316. #. type: Plain text
  3317. #: en/./users/05_Configuration.md:62
  3318. msgid ""
  3319. "By default, FreshRSS displays buttons to ease the article navigation when "
  3320. "browsing on mobile. The drawback is that they eat up some precious space."
  3321. msgstr ""
  3322. #. type: Plain text
  3323. #: en/./users/05_Configuration.md:64
  3324. msgid ""
  3325. "![navigation button "
  3326. "configuration](../img/users/configuration.navigation.button.png)"
  3327. msgstr ""
  3328. #. type: Plain text
  3329. #: en/./users/05_Configuration.md:66
  3330. msgid ""
  3331. "If you don't use those buttons because you never browse on mobile or because "
  3332. "you browse with gestures, you can disable them from the interface."
  3333. msgstr ""
  3334. #. type: Title #
  3335. #: en/./users/05_Configuration.md:67
  3336. #, no-wrap
  3337. msgid "Reading"
  3338. msgstr ""
  3339. #. type: Title ##
  3340. #: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154
  3341. #, no-wrap
  3342. msgid "Archival"
  3343. msgstr ""
  3344. #. type: Title #
  3345. #: en/./users/05_Configuration.md:75
  3346. #, no-wrap
  3347. msgid "Sharing"
  3348. msgstr ""
  3349. #. type: Plain text
  3350. #: en/./users/05_Configuration.md:78
  3351. msgid "To make your life easier, you can share articles straight from FreshRSS."
  3352. msgstr ""
  3353. #. type: Plain text
  3354. #: en/./users/05_Configuration.md:80
  3355. msgid ""
  3356. "At the moment, FreshRSS supports 18 sharing methods, ranging from "
  3357. "self-hosted services (Shaarli, etc.) to proprietary services (Facebook, "
  3358. "etc.)."
  3359. msgstr ""
  3360. #. type: Plain text
  3361. #: en/./users/05_Configuration.md:83
  3362. msgid ""
  3363. "By default, the sharing list is empty. ![Sharing "
  3364. "configuration](../img/users/configuration.sharing.png)"
  3365. msgstr ""
  3366. #. type: Plain text
  3367. #: en/./users/05_Configuration.md:85
  3368. msgid "To add a new item to the list, please follow the following simple steps:"
  3369. msgstr ""
  3370. #. type: Bullet: ' 1. '
  3371. #: en/./users/05_Configuration.md:90
  3372. msgid "Select the desired sharing method in the drop-down list."
  3373. msgstr ""
  3374. #. type: Bullet: ' 1. '
  3375. #: en/./users/05_Configuration.md:90
  3376. msgid "Press the ```✚``` button to add it to the list."
  3377. msgstr ""
  3378. #. type: Bullet: ' 1. '
  3379. #: en/./users/05_Configuration.md:90
  3380. msgid ""
  3381. "Configure the method in the list. All names can be modified in the "
  3382. "display. Some methods need the sharing URL to be able to work properly (ex: "
  3383. "Shaarli)."
  3384. msgstr ""
  3385. #. type: Bullet: ' 1. '
  3386. #: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95
  3387. msgid "Submit your changes."
  3388. msgstr ""
  3389. #. type: Plain text
  3390. #: en/./users/05_Configuration.md:92
  3391. msgid "To remove an item from the list, follow those simple steps:"
  3392. msgstr ""
  3393. #. type: Bullet: ' 1. '
  3394. #: en/./users/05_Configuration.md:95
  3395. msgid "Press the ```❌``` button next to the share method you want to remove."
  3396. msgstr ""
  3397. #. type: Title #
  3398. #: en/./users/05_Configuration.md:96
  3399. #, no-wrap
  3400. msgid "Shortcuts"
  3401. msgstr ""
  3402. #. type: Plain text
  3403. #: en/./users/05_Configuration.md:100
  3404. msgid ""
  3405. "To ease the use of the application, FreshRSS comes with a lot of predefined "
  3406. "keyboard shortcuts. They allow actions to improve the user experience with "
  3407. "a keyboard."
  3408. msgstr ""
  3409. #. type: Plain text
  3410. #: en/./users/05_Configuration.md:102
  3411. msgid ""
  3412. "Of course, if you're not satisfied with the key mapping, you can change you "
  3413. "configuration to fit your needs."
  3414. msgstr ""
  3415. #. type: Plain text
  3416. #: en/./users/05_Configuration.md:104
  3417. msgid "There are 4 types of shortcuts:"
  3418. msgstr ""
  3419. #. type: Bullet: ' 1. '
  3420. #: en/./users/05_Configuration.md:109
  3421. msgid "Views: they allow switching views with ease."
  3422. msgstr ""
  3423. #. type: Bullet: ' 1. '
  3424. #: en/./users/05_Configuration.md:109
  3425. msgid "Navigation: they allow navigation through articles, feeds, and categories."
  3426. msgstr ""
  3427. #. type: Bullet: ' 1. '
  3428. #: en/./users/05_Configuration.md:109
  3429. msgid ""
  3430. "Article actions: they allow interactions with an article, like sharing or "
  3431. "opening it on the original web-site."
  3432. msgstr ""
  3433. #. type: Bullet: ' 1. '
  3434. #: en/./users/05_Configuration.md:109
  3435. msgid ""
  3436. "Other actions: they allow other interactions with the application, like "
  3437. "opening the user queries menu or accessing the documentation."
  3438. msgstr ""
  3439. #. type: Plain text
  3440. #: en/./users/05_Configuration.md:112
  3441. msgid ""
  3442. "It's worth noting that the share article action has two levels. Once you "
  3443. "press the shortcut, a menu containing all the share options opens. To "
  3444. "choose one share option, you need to select it by its number. When there is "
  3445. "only one option, it's selected automatically though."
  3446. msgstr ""
  3447. #. type: Plain text
  3448. #: en/./users/05_Configuration.md:114
  3449. msgid "The same process applies to the user queries."
  3450. msgstr ""
  3451. #. type: Plain text
  3452. #: en/./users/05_Configuration.md:117
  3453. msgid ""
  3454. "Be aware that there is no validation on the selected shortcuts. This means "
  3455. "that if you assign a shortcut to more than one action, you'll end up with "
  3456. "some unexpected behavior."
  3457. msgstr ""
  3458. #. type: Title #
  3459. #: en/./users/05_Configuration.md:118
  3460. #, no-wrap
  3461. msgid "User queries"
  3462. msgstr ""
  3463. #. type: Plain text
  3464. #: en/./users/05_Configuration.md:122
  3465. msgid ""
  3466. "You can configure your [user queries](./03_Main_view.md) in that "
  3467. "section. There is not much to say here as it is pretty straightforward. You "
  3468. "can only change user query titles or drop them."
  3469. msgstr ""
  3470. #. type: Plain text
  3471. #: en/./users/05_Configuration.md:124
  3472. msgid "At the moment, there is no helper to build a user query from here."
  3473. msgstr ""
  3474. #. type: Title #
  3475. #: en/./users/05_Configuration.md:125
  3476. #, no-wrap
  3477. msgid "Users"
  3478. msgstr ""
  3479. #. type: Title ##
  3480. #: en/./users/05_Configuration.md:129
  3481. #, no-wrap
  3482. msgid "Authentication methods"
  3483. msgstr ""
  3484. #. type: Title ###
  3485. #: en/./users/05_Configuration.md:131
  3486. #, no-wrap
  3487. msgid "HTTP Authentication (Apache)"
  3488. msgstr ""
  3489. #. type: Bullet: ' 1. '
  3490. #: en/./users/05_Configuration.md:137
  3491. msgid "User control is based on the `.htaccess` file."
  3492. msgstr ""
  3493. #. type: Bullet: ' 2. '
  3494. #: en/./users/05_Configuration.md:137
  3495. msgid ""
  3496. "It is best practice to place the `.htaccess` file in the `./i/` subdirectory "
  3497. "so the API and other third party services can work."
  3498. msgstr ""
  3499. #. type: Bullet: ' 3. '
  3500. #: en/./users/05_Configuration.md:137
  3501. msgid ""
  3502. "If you want to limit all access to registered users only, place the file in "
  3503. "the FreshRSS directory itself or in a parent directory. Note that WebSub and "
  3504. "API will not work!"
  3505. msgstr ""
  3506. #. type: Bullet: ' 4. '
  3507. #: en/./users/05_Configuration.md:137
  3508. msgid "Example `.htaccess` file for a user \"marie\":"
  3509. msgstr ""
  3510. #. type: Plain text
  3511. #: en/./users/05_Configuration.md:138
  3512. #, no-wrap
  3513. msgid ""
  3514. "AuthUserFile /home/marie/repertoire/.htpasswd\n"
  3515. "AuthGroupFile /dev/null\n"
  3516. "AuthName \"Chez Marie\"\n"
  3517. "AuthType Basic\n"
  3518. "Require user marie\n"
  3519. msgstr ""
  3520. #. type: Plain text
  3521. #: en/./users/05_Configuration.md:147
  3522. msgid ""
  3523. "More information can be found in the [Apache "
  3524. "documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)."
  3525. msgstr ""
  3526. #. type: Title #
  3527. #: en/./users/05_Configuration.md:148
  3528. #, no-wrap
  3529. msgid "Subscription management"
  3530. msgstr ""
  3531. #. type: Title ##
  3532. #: en/./users/05_Configuration.md:150
  3533. #, no-wrap
  3534. msgid "Information"
  3535. msgstr ""
  3536. #. type: Title ##
  3537. #: en/./users/05_Configuration.md:158
  3538. #, no-wrap
  3539. msgid "Login"
  3540. msgstr ""
  3541. #. type: Title ##
  3542. #: en/./users/05_Configuration.md:162
  3543. #, no-wrap
  3544. msgid "Advanced"
  3545. msgstr ""
  3546. #. type: Title ###
  3547. #: en/./users/05_Configuration.md:164
  3548. #, no-wrap
  3549. msgid "Retrieve a truncated stream from within FreshRSS"
  3550. msgstr ""
  3551. #. type: Plain text
  3552. #: en/./users/05_Configuration.md:167
  3553. msgid ""
  3554. "This question comes up regularly, so we'll try to clarify how one can "
  3555. "retrieve a truncated RSS feed with FreshRSS. Please note that the process is "
  3556. "absolutely not user friendly, but it works. :)"
  3557. msgstr ""
  3558. #. type: Plain text
  3559. #: en/./users/05_Configuration.md:169
  3560. msgid ""
  3561. "Please be aware that this way you'll generate much more traffic to the "
  3562. "originating sites, and they might block you accordingly. FreshRSS "
  3563. "performance is also negatively affected, because you'll have to fetch the "
  3564. "full article content one by one. So it's a feature to use sparingly!"
  3565. msgstr ""
  3566. #. type: Plain text
  3567. #: en/./users/05_Configuration.md:171
  3568. msgid ""
  3569. "What's meant by \"CSS path of articles on the original site\" actually "
  3570. "corresponds to the \"path\" consisting of IDs and classes (which in HTML, "
  3571. "matches the id and class attributes) to retrieve only the interesting part "
  3572. "that corresponds to the article. Ideally, this path starts with an id (which "
  3573. "is unique to the page)."
  3574. msgstr ""
  3575. #. type: Title ####
  3576. #: en/./users/05_Configuration.md:172
  3577. #, no-wrap
  3578. msgid "Example: Rue89"
  3579. msgstr ""
  3580. #. type: Plain text
  3581. #: en/./users/05_Configuration.md:175
  3582. msgid ""
  3583. "To find this path, you have to go to the address of one of the truncated "
  3584. "articles (for example, "
  3585. "http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-lextase-dihn-pedagogie-inversee-246635). "
  3586. "You look have to look for the \"block\" of HTML that corresponds to article "
  3587. "content (in the source code!)."
  3588. msgstr ""
  3589. #. type: Plain text
  3590. #: en/./users/05_Configuration.md:177
  3591. #, no-wrap
  3592. msgid ""
  3593. "Here we find that the block that encompasses nothing but the content of the "
  3594. "article is ```<div class=\"content clearfix\">```. We'll only use the "
  3595. "`.content` class here. Nevertheless, as said above, it's best to start the "
  3596. "path with an id. If we go back to the parent block, we find ```<div "
  3597. "id=\"article\">``` and that's perfect! The path will be ```#article "
  3598. ".content```.\n"
  3599. msgstr ""
  3600. #. type: Title ####
  3601. #: en/./users/05_Configuration.md:178
  3602. #, no-wrap
  3603. msgid ""
  3604. "Add the corresponding classes to the article CSS path on the feed "
  3605. "configuration page. Examples:"
  3606. msgstr ""
  3607. #. type: Bullet: '* '
  3608. #: en/./users/05_Configuration.md:184
  3609. msgid "Rue89: ```#article .content```"
  3610. msgstr ""
  3611. #. type: Bullet: '* '
  3612. #: en/./users/05_Configuration.md:184
  3613. msgid "PCINpact: ```#actu_content```"
  3614. msgstr ""
  3615. #. type: Bullet: '* '
  3616. #: en/./users/05_Configuration.md:184
  3617. msgid "Lesnumériques: ```article#body div.text.clearfix```"
  3618. msgstr ""
  3619. #. type: Bullet: '* '
  3620. #: en/./users/05_Configuration.md:184
  3621. msgid "Phoronix: ```#main .content```"
  3622. msgstr ""
  3623. #. type: Title ###
  3624. #: en/./users/05_Configuration.md:185
  3625. #, no-wrap
  3626. msgid "Retrieve a truncated stream with external tools"
  3627. msgstr ""
  3628. #. type: Plain text
  3629. #: en/./users/05_Configuration.md:188
  3630. msgid "Complimentary tools can be used to retrieve full article content, such as:"
  3631. msgstr ""
  3632. #. type: Bullet: '* '
  3633. #: en/./users/05_Configuration.md:190
  3634. msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
  3635. msgstr ""
  3636. #. type: Bullet: '* '
  3637. #: en/./users/05_Configuration.md:190
  3638. msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
  3639. msgstr ""
  3640. #. type: Title #
  3641. #: en/./users/06_Fever_API.md:1
  3642. #, no-wrap
  3643. msgid "FreshRSS - Fever API implementation"
  3644. msgstr ""
  3645. #. type: Plain text
  3646. #: en/./users/06_Fever_API.md:5
  3647. msgid ""
  3648. "See the [page about our Google Reader compatible API](06_Mobile_access.md) "
  3649. "for another possibility and general aspects of API access."
  3650. msgstr ""
  3651. #. type: Title ##
  3652. #: en/./users/06_Fever_API.md:6
  3653. #, no-wrap
  3654. msgid "RSS clients"
  3655. msgstr ""
  3656. #. type: Plain text
  3657. #: en/./users/06_Fever_API.md:11
  3658. msgid ""
  3659. "There are many RSS clients that support the Fever API, but they seem to "
  3660. "understand the Fever API a bit differently. If your favourite client "
  3661. "doesn't work properly with this API, please create an issue and we'll have a "
  3662. "look. But we can **only** do that for free clients."
  3663. msgstr ""
  3664. #. type: Title ###
  3665. #: en/./users/06_Fever_API.md:12
  3666. #, no-wrap
  3667. msgid "Usage & Authentication"
  3668. msgstr ""
  3669. #. type: Plain text
  3670. #: en/./users/06_Fever_API.md:16
  3671. msgid ""
  3672. "Before you can start using this API, you have to enable and setup API "
  3673. "access, which is [documented "
  3674. "here](https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html), "
  3675. "and then reset the user’s API password."
  3676. msgstr ""
  3677. #. type: Plain text
  3678. #: en/./users/06_Fever_API.md:18
  3679. msgid ""
  3680. "Then point your mobile application to the `fever.php` address "
  3681. "(e.g. `https://freshrss.example.net/api/fever.php`)."
  3682. msgstr ""
  3683. #. type: Title #
  3684. #: en/./users/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44
  3685. #, no-wrap
  3686. msgid "Compatible clients"
  3687. msgstr ""
  3688. #. type: Plain text
  3689. #: en/./users/06_Fever_API.md:22
  3690. msgid "Tested with:"
  3691. msgstr ""
  3692. #. type: Plain text
  3693. #: en/./users/06_Fever_API.md:25
  3694. #, no-wrap
  3695. msgid ""
  3696. "* Android\n"
  3697. " * "
  3698. "[Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) "
  3699. "(Closed source)\n"
  3700. msgstr ""
  3701. #. type: Plain text
  3702. #: en/./users/06_Fever_API.md:30
  3703. #, no-wrap
  3704. msgid ""
  3705. "* iOS\n"
  3706. " * [Fiery "
  3707. "Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) "
  3708. "(Closed source)\n"
  3709. " * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) "
  3710. "(Commercial)\n"
  3711. " * [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader "
  3712. "API / native FreshRSS option when possible)\n"
  3713. msgstr ""
  3714. #. type: Plain text
  3715. #: en/./users/06_Fever_API.md:33
  3716. #, no-wrap
  3717. msgid ""
  3718. "* MacOS\n"
  3719. " * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
  3720. msgstr ""
  3721. #. type: Title ##
  3722. #: en/./users/06_Fever_API.md:35
  3723. #, no-wrap
  3724. msgid "Features"
  3725. msgstr ""
  3726. #. type: Plain text
  3727. #: en/./users/06_Fever_API.md:38
  3728. msgid "The following features are implemented:"
  3729. msgstr ""
  3730. #. type: Bullet: '* '
  3731. #: en/./users/06_Fever_API.md:48
  3732. msgid "fetching categories"
  3733. msgstr ""
  3734. #. type: Bullet: '* '
  3735. #: en/./users/06_Fever_API.md:48
  3736. msgid "fetching feeds"
  3737. msgstr ""
  3738. #. type: Bullet: '* '
  3739. #: en/./users/06_Fever_API.md:48
  3740. msgid ""
  3741. "fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
  3742. "since)"
  3743. msgstr ""
  3744. #. type: Bullet: '* '
  3745. #: en/./users/06_Fever_API.md:48
  3746. msgid "fetching favicons"
  3747. msgstr ""
  3748. #. type: Bullet: '* '
  3749. #: en/./users/06_Fever_API.md:48
  3750. msgid "setting read marker for item(s)"
  3751. msgstr ""
  3752. #. type: Bullet: '* '
  3753. #: en/./users/06_Fever_API.md:48
  3754. msgid "setting starred marker for item(s)"
  3755. msgstr ""
  3756. #. type: Bullet: '* '
  3757. #: en/./users/06_Fever_API.md:48
  3758. msgid "setting read marker for feed"
  3759. msgstr ""
  3760. #. type: Bullet: '* '
  3761. #: en/./users/06_Fever_API.md:48
  3762. msgid "setting read marker for category"
  3763. msgstr ""
  3764. #. type: Bullet: '* '
  3765. #: en/./users/06_Fever_API.md:48
  3766. msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
  3767. msgstr ""
  3768. #. type: Plain text
  3769. #: en/./users/06_Fever_API.md:50
  3770. msgid "The following features are not supported:"
  3771. msgstr ""
  3772. #. type: Bullet: '* '
  3773. #: en/./users/06_Fever_API.md:52
  3774. msgid ""
  3775. "**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
  3776. "similar or could be used to simulate it."
  3777. msgstr ""
  3778. #. type: Title ##
  3779. #: en/./users/06_Fever_API.md:53
  3780. #, no-wrap
  3781. msgid "Testing and debugging"
  3782. msgstr ""
  3783. #. type: Plain text
  3784. #: en/./users/06_Fever_API.md:56
  3785. msgid ""
  3786. "If this API does not work as expected in your RSS reader, you can test it "
  3787. "manually with a tool like [Postman](https://www.getpostman.com/)."
  3788. msgstr ""
  3789. #. type: Plain text
  3790. #: en/./users/06_Fever_API.md:58
  3791. msgid ""
  3792. "Configure a POST request to the URL "
  3793. "https://freshrss.example.net/api/fever.php?api which should give you the "
  3794. "result:"
  3795. msgstr ""
  3796. #. type: Code fence info string
  3797. #: en/./users/06_Fever_API.md:58 en/./users/06_Fever_API.md:80
  3798. #, no-wrap
  3799. msgid "json"
  3800. msgstr ""
  3801. #. type: Plain text
  3802. #: en/./users/06_Fever_API.md:58
  3803. #, no-wrap
  3804. msgid ""
  3805. "{\n"
  3806. "\t\"api_version\": 3,\n"
  3807. "\t\"auth\": 0\n"
  3808. "}\n"
  3809. msgstr ""
  3810. #. type: Plain text
  3811. #: en/./users/06_Fever_API.md:65
  3812. msgid "Great, the base setup seems to work!"
  3813. msgstr ""
  3814. #. type: Plain text
  3815. #: en/./users/06_Fever_API.md:68
  3816. msgid ""
  3817. "Now lets try an authenticated call. Fever uses an `api_key`, which is the "
  3818. "MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
  3819. "the password `freshrss`, here is a command-line example to compute the "
  3820. "resulting `api_key`"
  3821. msgstr ""
  3822. #. type: Code fence info string
  3823. #: en/./users/06_Fever_API.md:69 en/./users/06_Fever_API.md:75 en/./users/06_Mobile_access.md:69 en/./users/07_Frequently_Asked_Questions.md:37 en/./users/07_Frequently_Asked_Questions.md:45
  3824. #, no-wrap
  3825. msgid "sh"
  3826. msgstr ""
  3827. #. type: Plain text
  3828. #: en/./users/06_Fever_API.md:69
  3829. #, no-wrap
  3830. msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
  3831. msgstr ""
  3832. #. type: Plain text
  3833. #: en/./users/06_Fever_API.md:74
  3834. msgid ""
  3835. "Add a body to your POST request encoded as `form-data` and one key named "
  3836. "`api_key` with the value `your-password-hash`:"
  3837. msgstr ""
  3838. #. type: Plain text
  3839. #: en/./users/06_Fever_API.md:75
  3840. #, no-wrap
  3841. msgid ""
  3842. "curl -s -F \"api_key=$api_key\" "
  3843. "'https://freshrss.example.net/api/fever.php?api'\n"
  3844. msgstr ""
  3845. #. type: Plain text
  3846. #: en/./users/06_Fever_API.md:80
  3847. msgid "This should give:"
  3848. msgstr ""
  3849. #. type: Plain text
  3850. #: en/./users/06_Fever_API.md:80
  3851. #, no-wrap
  3852. msgid ""
  3853. "{\n"
  3854. "\t\"api_version\": 3,\n"
  3855. "\t\"auth\": 1,\n"
  3856. "\t\"last_refreshed_on_time\": \"1520013061\"\n"
  3857. "}\n"
  3858. msgstr ""
  3859. #. type: Plain text
  3860. #: en/./users/06_Fever_API.md:88
  3861. msgid ""
  3862. "Perfect, you're now authenticated and you can start testing the more "
  3863. "advanced features. To do so, change the URL and append the possible API "
  3864. "actions to your request parameters. Please refer to the [original Fever "
  3865. "documentation](https://feedafever.com/api) for more information."
  3866. msgstr ""
  3867. #. type: Plain text
  3868. #: en/./users/06_Fever_API.md:90
  3869. msgid "Some basic calls are:"
  3870. msgstr ""
  3871. #. type: Bullet: '* '
  3872. #: en/./users/06_Fever_API.md:100
  3873. msgid "https://freshrss.example.net/api/fever.php?api&items"
  3874. msgstr ""
  3875. #. type: Bullet: '* '
  3876. #: en/./users/06_Fever_API.md:100
  3877. msgid "https://freshrss.example.net/api/fever.php?api&feeds"
  3878. msgstr ""
  3879. #. type: Bullet: '* '
  3880. #: en/./users/06_Fever_API.md:100
  3881. msgid "https://freshrss.example.net/api/fever.php?api&groups"
  3882. msgstr ""
  3883. #. type: Bullet: '* '
  3884. #: en/./users/06_Fever_API.md:100
  3885. msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
  3886. msgstr ""
  3887. #. type: Bullet: '* '
  3888. #: en/./users/06_Fever_API.md:100
  3889. msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
  3890. msgstr ""
  3891. #. type: Bullet: '* '
  3892. #: en/./users/06_Fever_API.md:100
  3893. msgid "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
  3894. msgstr ""
  3895. #. type: Bullet: '* '
  3896. #: en/./users/06_Fever_API.md:100
  3897. msgid "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
  3898. msgstr ""
  3899. #. type: Bullet: '* '
  3900. #: en/./users/06_Fever_API.md:100
  3901. msgid "https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
  3902. msgstr ""
  3903. #. type: Bullet: '* '
  3904. #: en/./users/06_Fever_API.md:100
  3905. msgid "https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
  3906. msgstr ""
  3907. #. type: Plain text
  3908. #: en/./users/06_Fever_API.md:102
  3909. msgid ""
  3910. "Replace `some_id` with a real ID from your `freshrss_username_entry` "
  3911. "database."
  3912. msgstr ""
  3913. #. type: Title ###
  3914. #: en/./users/06_Fever_API.md:103
  3915. #, no-wrap
  3916. msgid "Debugging"
  3917. msgstr ""
  3918. #. type: Plain text
  3919. #: en/./users/06_Fever_API.md:106
  3920. msgid ""
  3921. "If nothing helps and your client is still misbehaving, you can add the "
  3922. "following lines to the beginning of the `fever.api` file to determine the "
  3923. "cause of the problems:"
  3924. msgstr ""
  3925. #. type: Plain text
  3926. #: en/./users/06_Fever_API.md:107
  3927. #, no-wrap
  3928. msgid ""
  3929. "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' "
  3930. ". json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
  3931. msgstr ""
  3932. #. type: Plain text
  3933. #: en/./users/06_Fever_API.md:112
  3934. msgid ""
  3935. "Then use your RSS client to query the API and afterwards check the file "
  3936. "`fever.log`."
  3937. msgstr ""
  3938. #. type: Title ##
  3939. #: en/./users/06_Fever_API.md:113
  3940. #, no-wrap
  3941. msgid "Credits"
  3942. msgstr ""
  3943. #. type: Plain text
  3944. #: en/./users/06_Fever_API.md:115
  3945. msgid ""
  3946. "This plugin was inspired by the "
  3947. "[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)."
  3948. msgstr ""
  3949. #. type: Plain text
  3950. #: en/./users/06_Mobile_access.md:2
  3951. msgid ""
  3952. "This page assumes you have completed the [server "
  3953. "setup](../admins/02_Installation.md)."
  3954. msgstr ""
  3955. #. type: Title #
  3956. #: en/./users/06_Mobile_access.md:3
  3957. #, no-wrap
  3958. msgid "Enable the API in FreshRSS"
  3959. msgstr ""
  3960. #. type: Bullet: '1. '
  3961. #: en/./users/06_Mobile_access.md:9
  3962. msgid ""
  3963. "Under the section “Authentication”, enable the option “Allow API access "
  3964. "(required for mobile apps)”."
  3965. msgstr ""
  3966. #. type: Plain text
  3967. #: en/./users/06_Mobile_access.md:9
  3968. #, no-wrap
  3969. msgid ""
  3970. "2. Under the section “Profile”, fill-in the field “API password (e.g., for "
  3971. "mobile apps)”.\n"
  3972. "\t* Every user must define an API password.\n"
  3973. "\t* The reason for an API-specific password is that it may be used in less "
  3974. "safe situations than the main password, and does not grant access to as many "
  3975. "things.\n"
  3976. msgstr ""
  3977. #. type: Plain text
  3978. #: en/./users/06_Mobile_access.md:12
  3979. msgid ""
  3980. "The rest of this page is about the Google Reader compatible API. See the "
  3981. "[page about the Fever compatible API](06_Fever_API.md) for another "
  3982. "possibility."
  3983. msgstr ""
  3984. #. type: Title #
  3985. #: en/./users/06_Mobile_access.md:14
  3986. #, no-wrap
  3987. msgid "Testing"
  3988. msgstr ""
  3989. #. type: Bullet: '3. '
  3990. #: en/./users/06_Mobile_access.md:21
  3991. msgid ""
  3992. "Under the section “Profile”, click on the link like "
  3993. "`https://rss.example.net/api/` next to the field “API password”."
  3994. msgstr ""
  3995. #. type: Plain text
  3996. #: en/./users/06_Mobile_access.md:21
  3997. #, no-wrap
  3998. msgid ""
  3999. "4. Click on first link “Check full server configuration”:\n"
  4000. "\t* If you get *PASS* then you are done, all is good: you may proceed to "
  4001. "step 6.\n"
  4002. "\t* If you get *Bad Request!* or *Not Found*, then your server probably does "
  4003. "not accept slashes `/` that are escaped `%2F`. Proceed to step 5.\n"
  4004. "\t* If you get any other error message, proceed to step 5.\n"
  4005. msgstr ""
  4006. #. type: Title #
  4007. #: en/./users/06_Mobile_access.md:23
  4008. #, no-wrap
  4009. msgid "Fix server configuration"
  4010. msgstr ""
  4011. #. type: Plain text
  4012. #: en/./users/06_Mobile_access.md:42
  4013. #, no-wrap
  4014. msgid ""
  4015. "5. Click on the second link “Check partial server configuration (without "
  4016. "`%2F` support)”:\n"
  4017. "\t* If you get `PASS`, then the problem is indeed that your server does not "
  4018. "accept slashes `/` that are escaped `%2F`.\n"
  4019. "\t\t* With Apache, remember the directive [`AllowEncodedSlashes "
  4020. "On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
  4021. "\t\t* Or use a client that does not escape slashes (such as EasyRSS), in "
  4022. "which case proceed to step 6.\n"
  4023. "\t* If you get *Service Unavailable!*, then check from step 1 again.\n"
  4024. "\t* With __Apache__:\n"
  4025. "\t\t* If you get *FAIL getallheaders!*, the combination of your PHP version "
  4026. "and your Web server does not provide access to "
  4027. "[`getallheaders`](http://php.net/getallheaders)\n"
  4028. "\t\t\t* Turn on Apache `mod_setenvif` (often enabled by default), or "
  4029. "`mod_rewrite` with the following procedure:\n"
  4030. "\t\t\t\t* Allow [`FileInfo` in "
  4031. "`.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): "
  4032. "see the [server setup](../admins/02_Installation.md) again.\n"
  4033. "\t\t\t\t* Enable "
  4034. "[`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):\n"
  4035. "\t\t\t\t\t* With Debian / Ubuntu: `sudo a2enmod rewrite`\n"
  4036. "\t* With __nginx__:\n"
  4037. "\t\t* If you get *Bad Request!*, check your server `PATH_INFO` "
  4038. "configuration.\n"
  4039. "\t\t* If you get *File not found!*, check your server "
  4040. "`fastcgi_split_path_info`.\n"
  4041. "\t* If you get *FAIL 64-bit or GMP extension!*, then your PHP version does "
  4042. "not pass the requirement of being 64-bit and/or have PHP "
  4043. "[GMP](http://php.net/gmp) extension.\n"
  4044. "\t\t* The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt "
  4045. "install php-gmp`\n"
  4046. "\t* Update and try again from step 3.\n"
  4047. msgstr ""
  4048. #. type: Plain text
  4049. #: en/./users/06_Mobile_access.md:48
  4050. #, no-wrap
  4051. msgid ""
  4052. "6. On the same FreshRSS API page, note the address given under “Your API "
  4053. "address”, like `https://freshrss.example.net/api/greader.php`\n"
  4054. "\t* Type the API address in a client, together with your FreshRSS username, "
  4055. "and the corresponding special API password.\n"
  4056. msgstr ""
  4057. #. type: Plain text
  4058. #: en/./users/06_Mobile_access.md:63
  4059. #, no-wrap
  4060. msgid ""
  4061. "7. Pick a client supporting a Google Reader-like API. Selection:\n"
  4062. "\t* Android\n"
  4063. "\t\t* "
  4064. "[News+](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) "
  4065. "with [News+ Google Reader "
  4066. "extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) "
  4067. "(Closed source)\n"
  4068. "\t\t* [FeedMe "
  4069. "3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) "
  4070. "(Closed source)\n"
  4071. "\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, "
  4072. "[F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
  4073. "\t* Linux\n"
  4074. "\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open "
  4075. "source)\n"
  4076. "\t* MacOS\n"
  4077. "\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Open source)\n"
  4078. "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
  4079. "\t* iOS\n"
  4080. "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
  4081. "\t* Firefox\n"
  4082. "\t\t* "
  4083. "[FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) "
  4084. "(Open source)\n"
  4085. msgstr ""
  4086. #. type: Title #
  4087. #: en/./users/06_Mobile_access.md:65
  4088. #, no-wrap
  4089. msgid "Google Reader compatible API"
  4090. msgstr ""
  4091. #. type: Plain text
  4092. #: en/./users/06_Mobile_access.md:68
  4093. msgid "Examples of basic queries:"
  4094. msgstr ""
  4095. #. type: Plain text
  4096. #: en/./users/06_Mobile_access.md:69
  4097. #, no-wrap
  4098. msgid ""
  4099. "# Initial login, using API password (Email and Passwd can be given either as "
  4100. "GET, or POST - better)\n"
  4101. "curl "
  4102. "'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
  4103. "SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
  4104. "Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
  4105. "\n"
  4106. "# Examples of read-only requests\n"
  4107. "curl -s -H \"Authorization:GoogleLogin "
  4108. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4109. " "
  4110. "'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
  4111. "\n"
  4112. "curl -s -H \"Authorization:GoogleLogin "
  4113. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4114. " "
  4115. "'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
  4116. "\n"
  4117. "curl -s -H \"Authorization:GoogleLogin "
  4118. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4119. " "
  4120. "'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
  4121. "\n"
  4122. "# Retrieve a token for requests making modifications\n"
  4123. "curl -H \"Authorization:GoogleLogin "
  4124. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4125. " 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
  4126. "8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
  4127. "\n"
  4128. "# Get articles, piped to jq for easier JSON reading\n"
  4129. "curl -s -H \"Authorization:GoogleLogin "
  4130. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4131. " "
  4132. "'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' "
  4133. "| jq .\n"
  4134. msgstr ""
  4135. #. type: Plain text
  4136. #: en/./users/07_Frequently_Asked_Questions.md:2
  4137. msgid ""
  4138. "We may not have answered all of your questions in the previous sections. The "
  4139. "FAQ contains some questions that have not been answered elsewhere."
  4140. msgstr ""
  4141. #. type: Title ##
  4142. #: en/./users/07_Frequently_Asked_Questions.md:3
  4143. #, no-wrap
  4144. msgid "What is `/i` at the end of the application URL?"
  4145. msgstr ""
  4146. #. type: Plain text
  4147. #: en/./users/07_Frequently_Asked_Questions.md:6
  4148. msgid "Of course, ```/i``` has a purpose! It's used for performance and usability:"
  4149. msgstr ""
  4150. #. type: Bullet: '* '
  4151. #: en/./users/07_Frequently_Asked_Questions.md:11
  4152. msgid ""
  4153. "It allows for serving icons, images, styles and scripts without "
  4154. "cookies. Without that trick, those files would be downloaded more often, "
  4155. "especially when form authentication is used. Also, HTTP requests would be "
  4156. "heavier."
  4157. msgstr ""
  4158. #. type: Bullet: '* '
  4159. #: en/./users/07_Frequently_Asked_Questions.md:11
  4160. msgid ""
  4161. "The ```./p/``` public root can be served without any HTTP access "
  4162. "restrictions. Whereas it could be implemented in ```./p/i/```."
  4163. msgstr ""
  4164. #. type: Bullet: '* '
  4165. #: en/./users/07_Frequently_Asked_Questions.md:11
  4166. msgid ""
  4167. "It avoids problems while serving public resources like ```favicon.ico```, "
  4168. "```robots.txt```, etc."
  4169. msgstr ""
  4170. #. type: Bullet: '* '
  4171. #: en/./users/07_Frequently_Asked_Questions.md:11
  4172. msgid ""
  4173. "It allows the logo to be displayed instead of a white page while hitting a "
  4174. "restriction or a delay during the loading process."
  4175. msgstr ""
  4176. #. type: Title ##
  4177. #: en/./users/07_Frequently_Asked_Questions.md:12
  4178. #, no-wrap
  4179. msgid "Why is `robots.txt` located in a sub-folder?"
  4180. msgstr ""
  4181. #. type: Plain text
  4182. #: en/./users/07_Frequently_Asked_Questions.md:15
  4183. msgid ""
  4184. "To increase security, FreshRSS is hosted in two sections. The first section "
  4185. "is public (the `./p` folder) and the second section is private (everything "
  4186. "else). Therefore the `robots.txt` file is located in the `./p` sub-folder."
  4187. msgstr ""
  4188. #. type: Plain text
  4189. #: en/./users/07_Frequently_Asked_Questions.md:17
  4190. msgid ""
  4191. "As explained in the [security "
  4192. "section](/en/User_documentation/Installation/Security), it's highly "
  4193. "recommended to make only the public section available at the domain "
  4194. "level. With that configuration, `./p` is the root folder for "
  4195. "http://demo.freshrss.org/, thus making `robots.txt` available at the root of "
  4196. "the application."
  4197. msgstr ""
  4198. #. type: Plain text
  4199. #: en/./users/07_Frequently_Asked_Questions.md:19
  4200. msgid "The same principle applies to `favicon.ico` and `.htaccess`."
  4201. msgstr ""
  4202. #. type: Title ##
  4203. #: en/./users/07_Frequently_Asked_Questions.md:20
  4204. #, no-wrap
  4205. msgid "Why do I have errors while registering a feed?"
  4206. msgstr ""
  4207. #. type: Plain text
  4208. #: en/./users/07_Frequently_Asked_Questions.md:26
  4209. msgid ""
  4210. "There can be different origins for that problem. The feed syntax can be "
  4211. "invalid, it can be unrecognized by the SimplePie library, the hosting server "
  4212. "can be the root of the problem, or FreshRSS can be buggy. The first step is "
  4213. "to identify what causes the problem. Here are the steps to follow:"
  4214. msgstr ""
  4215. #. type: Bullet: '1. '
  4216. #: en/./users/07_Frequently_Asked_Questions.md:30
  4217. msgid ""
  4218. "__Verify if the feed syntax is valid__ with the [W3C on-line "
  4219. "tool](https://validator.w3.org/feed/ \"RSS and Atom feed validator\"). If "
  4220. "it's not valid, there's nothing we can do."
  4221. msgstr ""
  4222. #. type: Bullet: '1. '
  4223. #: en/./users/07_Frequently_Asked_Questions.md:30
  4224. msgid ""
  4225. "__Verify SimplePie validation__ with the [SimplePie on-line "
  4226. "tool](https://simplepie.org/demo/ \"SimplePie official demo\"). If it's not "
  4227. "recognized, there's nothing we can do."
  4228. msgstr ""
  4229. #. type: Bullet: '1. '
  4230. #: en/./users/07_Frequently_Asked_Questions.md:30
  4231. msgid ""
  4232. "__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org "
  4233. "\"FreshRSS official demo\"). If it's not working, you need to [create an "
  4234. "issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an "
  4235. "issue for FreshRSS\") so we can have a look at it. If it's working, there's "
  4236. "probably something fishy with the hosting server."
  4237. msgstr ""
  4238. #. type: Title ##
  4239. #: en/./users/07_Frequently_Asked_Questions.md:31
  4240. #, no-wrap
  4241. msgid "How can you change a forgotten password?"
  4242. msgstr ""
  4243. #. type: Plain text
  4244. #: en/./users/07_Frequently_Asked_Questions.md:35
  4245. msgid ""
  4246. "Since the [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.10.0) "
  4247. "release, admins can change user passwords directly from the interface. This "
  4248. "interface is available under ```Administration → Manage users```. Select a "
  4249. "user, enter a password, and validate."
  4250. msgstr ""
  4251. #. type: Plain text
  4252. #: en/./users/07_Frequently_Asked_Questions.md:37
  4253. msgid ""
  4254. "Since the [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.8.0) "
  4255. "release, admins can change user passwords using a terminal. It worth "
  4256. "mentioning that you must have access to PHP CLI. Open a terminal, and type "
  4257. "the following command:"
  4258. msgstr ""
  4259. #. type: Plain text
  4260. #: en/./users/07_Frequently_Asked_Questions.md:37
  4261. #, no-wrap
  4262. msgid "./cli/update_user.php --user <username> --password <password>\n"
  4263. msgstr ""
  4264. #. type: Plain text
  4265. #: en/./users/07_Frequently_Asked_Questions.md:41
  4266. msgid ""
  4267. "For more information on that matter, please refer to the [dedicated "
  4268. "documentation](../../cli/README.md)."
  4269. msgstr ""
  4270. #. type: Title ##
  4271. #: en/./users/07_Frequently_Asked_Questions.md:42
  4272. #, no-wrap
  4273. msgid "Permissions under SELinux"
  4274. msgstr ""
  4275. #. type: Plain text
  4276. #: en/./users/07_Frequently_Asked_Questions.md:45
  4277. msgid ""
  4278. "Some Linux distribution, like Fedora or RedHat Enterprise Linux, have "
  4279. "SELinux enabled. This acts similar to a firewall application, so that "
  4280. "applications can't write or modify files under certain conditions. While "
  4281. "installing FreshRSS, step 2 can fail if the httpd process can't write to "
  4282. "some data sub-directories. The following command should be executed as root "
  4283. "to fix this problem:"
  4284. msgstr ""
  4285. #. type: Plain text
  4286. #: en/./users/07_Frequently_Asked_Questions.md:45
  4287. #, no-wrap
  4288. msgid ""
  4289. "semanage fcontext -a -t httpd_sys_rw_content_t "
  4290. "'/usr/share/FreshRSS/data(/.*)?'\n"
  4291. "restorecon -Rv /usr/share/FreshRSS/data\n"
  4292. msgstr ""
  4293. #. type: Title ##
  4294. #: en/./users/07_Frequently_Asked_Questions.md:50
  4295. #, no-wrap
  4296. msgid "Why do I have a blank page while trying to configure the sharing options?"
  4297. msgstr ""
  4298. #. type: Plain text
  4299. #: en/./users/07_Frequently_Asked_Questions.md:53
  4300. msgid ""
  4301. "The `sharing` word in the URL is a trigger word for some ad-blocker "
  4302. "rules. Starting with version 1.16, `sharing` has been replaced by "
  4303. "`integration` in the faulty URL while keeping the exact same wording "
  4304. "throughout the application."
  4305. msgstr ""
  4306. #. type: Plain text
  4307. #: en/./users/07_Frequently_Asked_Questions.md:55
  4308. msgid ""
  4309. "If you are using a version prior to 1.16, you can disable your ad-blocker "
  4310. "for FreshRSS or you can add a rule to allow the `sharing` page to be "
  4311. "accessed."
  4312. msgstr ""
  4313. #. type: Plain text
  4314. #: en/./users/07_Frequently_Asked_Questions.md:57
  4315. msgid "Examples with _uBlock_:"
  4316. msgstr ""
  4317. #. type: Bullet: '- '
  4318. #: en/./users/07_Frequently_Asked_Questions.md:59
  4319. msgid ""
  4320. "Whitelist your FreshRSS instance by adding it in _uBlock > Open the "
  4321. "dashboard > Whitelist_."
  4322. msgstr ""
  4323. #. type: Bullet: '- '
  4324. #: en/./users/07_Frequently_Asked_Questions.md:59
  4325. msgid ""
  4326. "Authorize your FreshRSS instance to call `sharing` configuration page by "
  4327. "adding the rule `*sharing,domain=~yourdomain.com` in _uBlock > Open the "
  4328. "dashboard > My filters_"
  4329. msgstr ""