freshrss.pot 147 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294
  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: 2020-02-29 18:49+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 en/./developers/04_Pull_requests.md:23 en/./developers/04_Pull_requests.md:38
  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:383 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:378
  1980. msgid ""
  1981. "`check_url_before_add` (`function($url) -> Url | null`): will be executed "
  1982. "every time a URL is added. The URL itself will be passed as parameter. This "
  1983. "way a website known to have feeds which doesn't advertise it in the header "
  1984. "can still be automatically supported."
  1985. msgstr ""
  1986. #. type: Bullet: '* '
  1987. #: en/./developers/03_Backend/05_Extensions.md:378
  1988. msgid ""
  1989. "`entry_before_display` (`function($entry) -> Entry | null`): will be "
  1990. "executed every time an entry is rendered. The entry itself (instance of "
  1991. "FreshRSS\\_Entry) will be passed as parameter."
  1992. msgstr ""
  1993. #. type: Bullet: '* '
  1994. #: en/./developers/03_Backend/05_Extensions.md:378
  1995. msgid ""
  1996. "`entry_before_insert` (`function($entry) -> Entry | null`): will be executed "
  1997. "when a feed is refreshed and new entries will be imported into the "
  1998. "database. The new entry (instance of FreshRSS\\_Entry) will be passed as "
  1999. "parameter."
  2000. msgstr ""
  2001. #. type: Bullet: '* '
  2002. #: en/./developers/03_Backend/05_Extensions.md:378
  2003. msgid ""
  2004. "`feed_before_actualize` (`function($feed) -> Feed | null`): will be executed "
  2005. "when a feed is updated. The feed (instance of FreshRSS\\_Feed) will be "
  2006. "passed as parameter."
  2007. msgstr ""
  2008. #. type: Bullet: '* '
  2009. #: en/./developers/03_Backend/05_Extensions.md:378
  2010. msgid ""
  2011. "`feed_before_insert` (`function($feed) -> Feed | null`): will be executed "
  2012. "when a new feed is imported into the database. The new feed (instance of "
  2013. "FreshRSS\\_Feed) will be passed as parameter."
  2014. msgstr ""
  2015. #. type: Bullet: '* '
  2016. #: en/./developers/03_Backend/05_Extensions.md:378
  2017. msgid ""
  2018. "`freshrss_init` (`function() -> none`): will be executed at the end of the "
  2019. "initialization of FreshRSS, useful to initialize components or to do "
  2020. "additional access checks"
  2021. msgstr ""
  2022. #. type: Bullet: '* '
  2023. #: en/./developers/03_Backend/05_Extensions.md:378
  2024. msgid ""
  2025. "`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
  2026. "\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
  2027. "class=\"item active\"><a href=\"url\">New entry</a></li>`)"
  2028. msgstr ""
  2029. #. type: Bullet: '* '
  2030. #: en/./developers/03_Backend/05_Extensions.md:378
  2031. msgid ""
  2032. "`menu_configuration_entry` (`function() -> string`): add an entry at the end "
  2033. "of the \"Configuration\" menu, the returned string must be valid HTML "
  2034. "(e.g. `<li class=\"item active\"><a href=\"url\">New entry</a></li>`)"
  2035. msgstr ""
  2036. #. type: Bullet: '* '
  2037. #: en/./developers/03_Backend/05_Extensions.md:378
  2038. msgid ""
  2039. "`menu_other_entry` (`function() -> string`): add an entry at the end of the "
  2040. "header dropdown menu (i.e. after the \"About\" entry), the returned string "
  2041. "must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
  2042. "entry</a></li>`)"
  2043. msgstr ""
  2044. #. type: Bullet: '* '
  2045. #: en/./developers/03_Backend/05_Extensions.md:378
  2046. msgid ""
  2047. "`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
  2048. "add documentation"
  2049. msgstr ""
  2050. #. type: Bullet: '* '
  2051. #: en/./developers/03_Backend/05_Extensions.md:378
  2052. msgid "`post_update` (`function(none) -> none`): **TODO** add documentation"
  2053. msgstr ""
  2054. #. type: Bullet: '* '
  2055. #: en/./developers/03_Backend/05_Extensions.md:378
  2056. msgid ""
  2057. "`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
  2058. "add documentation"
  2059. msgstr ""
  2060. #. type: Title ###
  2061. #: en/./developers/03_Backend/05_Extensions.md:379
  2062. #, no-wrap
  2063. msgid "Writing your own configure.phtml"
  2064. msgstr ""
  2065. #. type: Plain text
  2066. #: en/./developers/03_Backend/05_Extensions.md:382
  2067. msgid ""
  2068. "When you want to support user configurations for your extension or simply "
  2069. "display some information, you have to create the `configure.phtml` file."
  2070. msgstr ""
  2071. #. type: Title #
  2072. #: en/./developers/03_Running_tests.md:1
  2073. #, no-wrap
  2074. msgid "Running tests"
  2075. msgstr ""
  2076. #. type: Plain text
  2077. #: en/./developers/03_Running_tests.md:4
  2078. msgid ""
  2079. "FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be "
  2080. "merged in `master` if the tests don't pass."
  2081. msgstr ""
  2082. #. type: Title ##
  2083. #: en/./developers/03_Running_tests.md:5
  2084. #, no-wrap
  2085. msgid "Locally"
  2086. msgstr ""
  2087. #. type: Plain text
  2088. #: en/./developers/03_Running_tests.md:8
  2089. msgid ""
  2090. "As a developer, you can run the test suite on your PC easily with `make` "
  2091. "commands. You can run the test suite with:"
  2092. msgstr ""
  2093. #. type: Plain text
  2094. #: en/./developers/03_Running_tests.md:9
  2095. #, no-wrap
  2096. msgid "$ make test\n"
  2097. msgstr ""
  2098. #. type: Plain text
  2099. #: en/./developers/03_Running_tests.md:14
  2100. msgid ""
  2101. "This command downloads the PHPUnit binary and verifies its checksum. If the "
  2102. "verification fails, the file is deleted. In this case, you should [open an "
  2103. "issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let "
  2104. "maintainers know about the problem."
  2105. msgstr ""
  2106. #. type: Plain text
  2107. #: en/./developers/03_Running_tests.md:16
  2108. msgid ""
  2109. "Then, it executes PHPUnit in a Docker container. If you don't use Docker, "
  2110. "you can run the command directly with:"
  2111. msgstr ""
  2112. #. type: Plain text
  2113. #: en/./developers/03_Running_tests.md:17
  2114. #, no-wrap
  2115. msgid "$ NO_DOCKER=true make test\n"
  2116. msgstr ""
  2117. #. type: Title ##
  2118. #: en/./developers/03_Running_tests.md:21
  2119. #, no-wrap
  2120. msgid "Travis"
  2121. msgstr ""
  2122. #. type: Plain text
  2123. #: en/./developers/03_Running_tests.md:24
  2124. msgid ""
  2125. "Tests are automatically run when you open a pull request on GitHub. It is "
  2126. "done with [Travis CI](https://travis-ci.org/FreshRSS/FreshRSS/). This is "
  2127. "done to ensure there is no regressions in your code. We cannot merge a PR if "
  2128. "the tests fail so we'll ask you to fix bugs before to review your code."
  2129. msgstr ""
  2130. #. type: Plain text
  2131. #: en/./developers/03_Running_tests.md:25
  2132. msgid ""
  2133. "If you're interested in, you can take a look at [the configuration "
  2134. "file](https://github.com/FreshRSS/FreshRSS/blob/master/.travis.yml)."
  2135. msgstr ""
  2136. #. type: Title #
  2137. #: en/./developers/04_Frontend/01_View_files.md:1
  2138. #, no-wrap
  2139. msgid "The .phtml files"
  2140. msgstr ""
  2141. #. type: Title #
  2142. #: en/./developers/04_Frontend/01_View_files.md:5
  2143. #, no-wrap
  2144. msgid "Writing a URL"
  2145. msgstr ""
  2146. #. type: Title #
  2147. #: en/./developers/04_Frontend/01_View_files.md:9
  2148. #, no-wrap
  2149. msgid "Displaying an icon"
  2150. msgstr ""
  2151. #. type: Title #
  2152. #: en/./developers/04_Frontend/02_Design.md:1
  2153. #, no-wrap
  2154. msgid "Template file"
  2155. msgstr ""
  2156. #. type: Title #
  2157. #: en/./developers/04_Frontend/02_Design.md:5
  2158. #, no-wrap
  2159. msgid "Writing a new theme"
  2160. msgstr ""
  2161. #. type: Title #
  2162. #: en/./developers/04_Frontend/02_Design.md:9
  2163. #, no-wrap
  2164. msgid "Overriding icons"
  2165. msgstr ""
  2166. #. type: Title #
  2167. #: en/./developers/04_Pull_requests.md:1
  2168. #, no-wrap
  2169. msgid "Opening a pull request"
  2170. msgstr ""
  2171. #. type: Plain text
  2172. #: en/./developers/04_Pull_requests.md:4
  2173. msgid ""
  2174. "So you want to propose a patch to the community? It's time to open a [pull "
  2175. "request](https://github.com/FreshRSS/FreshRSS/pulls)!"
  2176. msgstr ""
  2177. #. type: Plain text
  2178. #: en/./developers/04_Pull_requests.md:6
  2179. msgid ""
  2180. "When you open a PR, your message will be prefilled with a message based on "
  2181. "[a "
  2182. "template](https://github.com/FreshRSS/FreshRSS/blob/master/docs/pull_request_template.md). "
  2183. "It contains a checklist to make sure you didn't forget anything. It is very "
  2184. "important to verify you did everything mentioned so documentation is "
  2185. "up-to-date, the commit history stays clear and the code is always stable."
  2186. msgstr ""
  2187. #. type: Plain text
  2188. #: en/./developers/04_Pull_requests.md:8
  2189. msgid "The rest of this document explains specific points."
  2190. msgstr ""
  2191. #. type: Title ##
  2192. #: en/./developers/04_Pull_requests.md:9
  2193. #, no-wrap
  2194. msgid "How to rebase your branch on `master`"
  2195. msgstr ""
  2196. #. type: Plain text
  2197. #: en/./developers/04_Pull_requests.md:12
  2198. msgid ""
  2199. "Rebasing a branch is useful to make sure your code is based on the most "
  2200. "recent version of FreshRSS and there are no conflicts. You have two ways to "
  2201. "do that."
  2202. msgstr ""
  2203. #. type: Plain text
  2204. #: en/./developers/04_Pull_requests.md:14
  2205. msgid ""
  2206. "If you have any doubt, please let us know and we'll help you! We all began "
  2207. "with Git one day and it's not an easy thing to work with."
  2208. msgstr ""
  2209. #. type: Title ###
  2210. #: en/./developers/04_Pull_requests.md:15
  2211. #, no-wrap
  2212. msgid "Rebasing"
  2213. msgstr ""
  2214. #. type: Plain text
  2215. #: en/./developers/04_Pull_requests.md:18
  2216. msgid ""
  2217. "Rebasing is the cleanest method because the Git history will be completely "
  2218. "linear and consequently easier to read and navigate. It might also be more "
  2219. "difficult if you're not at ease with Git since conflicts are harder to "
  2220. "resolve."
  2221. msgstr ""
  2222. #. type: Plain text
  2223. #: en/./developers/04_Pull_requests.md:20
  2224. msgid ""
  2225. "Note that you should never rebase a branch if someone else is working on "
  2226. "it. Otherwise, since it rewrites the history, it can be a real mess to sort "
  2227. "it out."
  2228. msgstr ""
  2229. #. type: Plain text
  2230. #: en/./developers/04_Pull_requests.md:22
  2231. msgid "To rebase a branch:"
  2232. msgstr ""
  2233. #. type: Plain text
  2234. #: en/./developers/04_Pull_requests.md:23
  2235. #, no-wrap
  2236. msgid ""
  2237. "$ git checkout master # go on master branch\n"
  2238. "$ git pull upstream master # pull the last version of master\n"
  2239. "$ git checkout - # go back to your branch\n"
  2240. "$ git rebase master # rebase your branch on master\n"
  2241. msgstr ""
  2242. #. type: Plain text
  2243. #: en/./developers/04_Pull_requests.md:31
  2244. msgid ""
  2245. "If you feel confident, you can use `git rebase -i master` to rewrite your "
  2246. "history and make it clearer."
  2247. msgstr ""
  2248. #. type: Title ###
  2249. #: en/./developers/04_Pull_requests.md:32
  2250. #, no-wrap
  2251. msgid "Merging"
  2252. msgstr ""
  2253. #. type: Plain text
  2254. #: en/./developers/04_Pull_requests.md:35
  2255. msgid ""
  2256. "If you prefer, you can simply merge `master` into your own branch. Conflicts "
  2257. "might be easier to resolve, but your Git history will be less "
  2258. "readable. Don't worry, we'll take care of it before merging your PR back "
  2259. "into `master`."
  2260. msgstr ""
  2261. #. type: Plain text
  2262. #: en/./developers/04_Pull_requests.md:37
  2263. msgid "To merge `master`:"
  2264. msgstr ""
  2265. #. type: Plain text
  2266. #: en/./developers/04_Pull_requests.md:38
  2267. #, no-wrap
  2268. msgid ""
  2269. "$ git checkout master # go on master branch\n"
  2270. "$ git pull upstream master # pull the last version of master\n"
  2271. "$ git checkout - # go back to your branch\n"
  2272. "$ git merge master # merge master into your branch\n"
  2273. msgstr ""
  2274. #. type: Title ##
  2275. #: en/./developers/04_Pull_requests.md:45
  2276. #, no-wrap
  2277. msgid "How to write a Git commit message"
  2278. msgstr ""
  2279. #. type: Plain text
  2280. #: en/./developers/04_Pull_requests.md:48
  2281. msgid ""
  2282. "It's important to have proper commit messages in order to facilitate later "
  2283. "debugging, so please read the following advice. Commit messages should "
  2284. "explain the choices made in the past (the “why?”)"
  2285. msgstr ""
  2286. #. type: Plain text
  2287. #: en/./developers/04_Pull_requests.md:50
  2288. msgid ""
  2289. "The first line should start with a verb (e.g., \"Add\") and explain the "
  2290. "objective of the commit in few words. It's usually less than 50 characters "
  2291. "so it remains concise. You can consider this line the subject of your "
  2292. "commit. Think of it as the second part of a sentence that starts with the "
  2293. "words \"This commit will.\""
  2294. msgstr ""
  2295. #. type: Bullet: '* '
  2296. #: en/./developers/04_Pull_requests.md:52
  2297. msgid "This commit will *add feature X*"
  2298. msgstr ""
  2299. #. type: Plain text
  2300. #: en/./developers/04_Pull_requests.md:54
  2301. msgid ""
  2302. "Then, insert a blank line, and start to write the body. It's usually wrapped "
  2303. "at 72 characters, but you are pretty free in the tone of the message. The "
  2304. "body is the place where you can clarify the context of your patch. For "
  2305. "instance, you can explain what you were doing when you identified a bug, or "
  2306. "the problem you had before your patch. Providing this information helps "
  2307. "other developers understand why a specific choice was made, especially when "
  2308. "a patch introduces a bug that is identified months later."
  2309. msgstr ""
  2310. #. type: Plain text
  2311. #: en/./developers/04_Pull_requests.md:56
  2312. msgid ""
  2313. "You also can add references (e.g., the URL to the initial ticket in the bug "
  2314. "tracker, or a reference to some forum explaining a point)."
  2315. msgstr ""
  2316. #. type: Plain text
  2317. #: en/./developers/04_Pull_requests.md:58
  2318. msgid ""
  2319. "You can find more information about commit messages [on this blog "
  2320. "post](https://chris.beams.io/posts/git-commit/)."
  2321. msgstr ""
  2322. #. type: Title ##
  2323. #: en/./developers/04_Pull_requests.md:59
  2324. #, no-wrap
  2325. msgid "How to write tests"
  2326. msgstr ""
  2327. #. type: Plain text
  2328. #: en/./developers/04_Pull_requests.md:62
  2329. msgid ""
  2330. "FreshRSS has few tests for now, but we're working on it. We added this point "
  2331. "to the checklist to help us to write more tests, and we would really "
  2332. "appreciate it if you wrote a test that ensures your patch is working."
  2333. msgstr ""
  2334. #. type: Plain text
  2335. #: en/./developers/04_Pull_requests.md:64
  2336. msgid ""
  2337. "We use [PHPUnit](https://phpunit.de/) version 7.5 "
  2338. "([documentation](https://phpunit.readthedocs.io/en/7.5/))."
  2339. msgstr ""
  2340. #. type: Plain text
  2341. #: en/./developers/04_Pull_requests.md:66
  2342. msgid ""
  2343. "You'll find more information on how to run tests [in this "
  2344. "document](03_Running_tests.md)."
  2345. msgstr ""
  2346. #. type: Plain text
  2347. #: en/./developers/04_Pull_requests.md:68
  2348. msgid ""
  2349. "Feel free to ask us for assistance. Not everything will be easy to test, so "
  2350. "don't spend too much time on this."
  2351. msgstr ""
  2352. #. type: Title ##
  2353. #: en/./developers/04_Pull_requests.md:69
  2354. #, no-wrap
  2355. msgid "Why you should write documentation"
  2356. msgstr ""
  2357. #. type: Plain text
  2358. #: en/./developers/04_Pull_requests.md:72
  2359. msgid ""
  2360. "A friendly project should have correct and complete documentation, so "
  2361. "newcomers don't have to ask too many questions, and users can find answers "
  2362. "to their problems. The documentation should not be written “later” or "
  2363. "chances are it'll never be."
  2364. msgstr ""
  2365. #. type: Plain text
  2366. #: en/./developers/04_Pull_requests.md:73
  2367. msgid ""
  2368. "Our documentation can still be improved quite a bit, so you're very welcome "
  2369. "if you want to help."
  2370. msgstr ""
  2371. #. type: Title #
  2372. #: en/./developers/05_Release_new_version.md:1
  2373. #, no-wrap
  2374. msgid "Preparing the release"
  2375. msgstr ""
  2376. #. type: Plain text
  2377. #: en/./developers/05_Release_new_version.md:4
  2378. msgid ""
  2379. "In order to get as much feedback as possible before a release, it's "
  2380. "preferable to announce it on GitHub by creating a dedicated ticket ([see "
  2381. "examples] "
  2382. "(https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). "
  2383. "This should be done **at least one week in advance**."
  2384. msgstr ""
  2385. #. type: Plain text
  2386. #: en/./developers/05_Release_new_version.md:6
  2387. msgid "It's also recommended to make the announcement on mailing@freshrss.org."
  2388. msgstr ""
  2389. #. type: Title #
  2390. #: en/./developers/05_Release_new_version.md:7
  2391. #, no-wrap
  2392. msgid "Check the dev status"
  2393. msgstr ""
  2394. #. type: Plain text
  2395. #: en/./developers/05_Release_new_version.md:10
  2396. msgid ""
  2397. "Before releasing a new version of FreshRSS, you must ensure that the code is "
  2398. "stable and free of major bugs. Ideally, our tests should be automated and "
  2399. "executed before any publication."
  2400. msgstr ""
  2401. #. type: Plain text
  2402. #: en/./developers/05_Release_new_version.md:12
  2403. msgid ""
  2404. "You must also **make sure that the CHANGELOG file is up to date** with the "
  2405. "updates of the version to be released."
  2406. msgstr ""
  2407. #. type: Title #
  2408. #: en/./developers/05_Release_new_version.md:13
  2409. #, no-wrap
  2410. msgid "Git process"
  2411. msgstr ""
  2412. #. type: Plain text
  2413. #: en/./developers/05_Release_new_version.md:15
  2414. #, no-wrap
  2415. msgid ""
  2416. "$ git checkout master\n"
  2417. "$ git pull\n"
  2418. "$ vim constants.php\n"
  2419. "# Update version number x.y.y.z of FRESHRSS_VERSION\n"
  2420. "$ git commit -a\n"
  2421. "Version x.y.z\n"
  2422. "$ git tag -a x.y.z\n"
  2423. "Version x.y.z\n"
  2424. "$ git push && git push --tags\n"
  2425. msgstr ""
  2426. #. type: Title #
  2427. #: en/./developers/05_Release_new_version.md:27
  2428. #, no-wrap
  2429. msgid "Updating `update.freshrss.org`"
  2430. msgstr ""
  2431. #. type: Plain text
  2432. #: en/./developers/05_Release_new_version.md:30
  2433. msgid ""
  2434. "It's important to update update.freshrss.org since this is the default "
  2435. "service for automatic FreshRSS updates."
  2436. msgstr ""
  2437. #. type: Plain text
  2438. #: en/./developers/05_Release_new_version.md:32
  2439. msgid ""
  2440. "The repository managing the code is located on GitHub: "
  2441. "[FreshRSS/update.freshrss.org] "
  2442. "(https://github.com/FreshRSS/update.freshrss.org/)."
  2443. msgstr ""
  2444. #. type: Title ##
  2445. #: en/./developers/05_Release_new_version.md:33
  2446. #, no-wrap
  2447. msgid "Writing the update script"
  2448. msgstr ""
  2449. #. type: Plain text
  2450. #: en/./developers/05_Release_new_version.md:36
  2451. msgid ""
  2452. "The scripts are located in the `./scripts/` directory and must take the form "
  2453. "`update_to_x.y.z.z.php`. This directory also contains `update_to_dev.php` "
  2454. "intended for updates of the `master` branch (this script must not include "
  2455. "code specific to a particular version!) and `update_util.php`, which "
  2456. "contains a list of functions useful for all scripts."
  2457. msgstr ""
  2458. #. type: Plain text
  2459. #: en/./developers/05_Release_new_version.md:38
  2460. msgid ""
  2461. "In order to write a new script, it's better to copy/paste the last version "
  2462. "or to start from `update_to_dev.php`. The first thing to do is to define the "
  2463. "URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The "
  2464. "URL is in the form of "
  2465. "`https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y.z`."
  2466. msgstr ""
  2467. #. type: Plain text
  2468. #: en/./developers/05_Release_new_version.md:40
  2469. msgid "There are then 5 functions that have to be executed:"
  2470. msgstr ""
  2471. #. type: Bullet: '* '
  2472. #: en/./developers/05_Release_new_version.md:46
  2473. msgid ""
  2474. "`apply_update()` takes care of saving the directory containing the data, "
  2475. "checking its structure, downloading the FreshRSS package, deploying it and "
  2476. "cleaning it all up. This function is pre-filled but adjustments can be made "
  2477. "if necessary (e.g., reorganization of the `./data` structure). It returns "
  2478. "`true` if no problem has occurred or a string indicating a problem;"
  2479. msgstr ""
  2480. #. type: Bullet: '* '
  2481. #: en/./developers/05_Release_new_version.md:46
  2482. msgid ""
  2483. "`need_info_update()` returns `true` if the user must intervene during the "
  2484. "update or `false` if not;"
  2485. msgstr ""
  2486. #. type: Bullet: '* '
  2487. #: en/./developers/05_Release_new_version.md:46
  2488. msgid ""
  2489. "`ask_info_update()` displays a form to the user if `need_info_update()` has "
  2490. "returned `true`;"
  2491. msgstr ""
  2492. #. type: Bullet: '* '
  2493. #: en/./developers/05_Release_new_version.md:46
  2494. msgid ""
  2495. "`save_info_update()` is responsible for saving the information filled out by "
  2496. "the user (from the `ask_info_update()` form);"
  2497. msgstr ""
  2498. #. type: Bullet: '* '
  2499. #: en/./developers/05_Release_new_version.md:46
  2500. msgid ""
  2501. "`do_post_update()` is executed at the end of the update and takes into "
  2502. "account the code of the new version (e.g., if the new version changes the "
  2503. "`Minz_Configuration` object, you will benefit from these improvements)."
  2504. msgstr ""
  2505. #. type: Title ##
  2506. #: en/./developers/05_Release_new_version.md:47
  2507. #, no-wrap
  2508. msgid "Updating the versions file"
  2509. msgstr ""
  2510. #. type: Plain text
  2511. #: en/./developers/05_Release_new_version.md:50
  2512. msgid ""
  2513. "Once the script has been written and versioned, it's necessary to update the "
  2514. "`./versions.php' file which contains a mapping table indicating which "
  2515. "versions are updated to which other versions."
  2516. msgstr ""
  2517. #. type: Plain text
  2518. #: en/./developers/05_Release_new_version.md:52
  2519. msgid "Here's an example of a `versions.php` file:"
  2520. msgstr ""
  2521. #. type: Plain text
  2522. #: en/./developers/05_Release_new_version.md:53
  2523. #, no-wrap
  2524. msgid ""
  2525. "<?php\n"
  2526. "return array(\n"
  2527. "\t// STABLE\n"
  2528. "\t'0.8.0' => '1.0.0',\n"
  2529. "\t'0.8.1' => '1.0.0',\n"
  2530. "\t'1.0.0' => '1.0.1', // doesn't exist (yet)\n"
  2531. "\t// DEV\n"
  2532. "\t'1.1.2-dev' => 'dev',\n"
  2533. "\t'1.1.3-dev' => 'dev',\n"
  2534. "\t'1.1.4-dev' => 'dev',\n"
  2535. ");\n"
  2536. msgstr ""
  2537. #. type: Plain text
  2538. #: en/./developers/05_Release_new_version.md:68
  2539. msgid "And here's how this table works:"
  2540. msgstr ""
  2541. #. type: Bullet: '* '
  2542. #: en/./developers/05_Release_new_version.md:74
  2543. msgid "on the left you can find the N version, on the right the N+1 version;"
  2544. msgstr ""
  2545. #. type: Bullet: '* '
  2546. #: en/./developers/05_Release_new_version.md:74
  2547. msgid "the `x.y.z.z-dev` versions are **all** updated to `master`;"
  2548. msgstr ""
  2549. #. type: Bullet: '* '
  2550. #: en/./developers/05_Release_new_version.md:74
  2551. msgid "stable versions are updated to stable versions;"
  2552. msgstr ""
  2553. #. type: Bullet: '* '
  2554. #: en/./developers/05_Release_new_version.md:74
  2555. msgid ""
  2556. "it's possible to skip several versions at once, provided that the update "
  2557. "scripts support it;"
  2558. msgstr ""
  2559. #. type: Bullet: '* '
  2560. #: en/./developers/05_Release_new_version.md:74
  2561. msgid ""
  2562. "it's advisable to indicate the correspondence of the current version to its "
  2563. "potential future version by specifying that this version does not yet "
  2564. "exist. As long as the corresponding script does not exist, nothing will "
  2565. "happen."
  2566. msgstr ""
  2567. #. type: Plain text
  2568. #: en/./developers/05_Release_new_version.md:76
  2569. msgid ""
  2570. "It's **very strongly** recommended to keep this file organized according to "
  2571. "version numbers by separating stable and dev versions."
  2572. msgstr ""
  2573. #. type: Title ##
  2574. #: en/./developers/05_Release_new_version.md:77
  2575. #, no-wrap
  2576. msgid "Deployment"
  2577. msgstr ""
  2578. #. type: Plain text
  2579. #: en/./developers/05_Release_new_version.md:80
  2580. msgid ""
  2581. "Before updating update.freshrss.org, it's better to test with "
  2582. "dev.update.freshrss.org, which corresponds to pre-production. So update "
  2583. "dev.update.freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your "
  2584. "FreshRSS instance. Start the update and check that it's running correctly."
  2585. msgstr ""
  2586. #. type: Plain text
  2587. #: en/./developers/05_Release_new_version.md:82
  2588. msgid ""
  2589. "When you're satisfied, update update.freshrss.org with the new script, test "
  2590. "it again, and then move on."
  2591. msgstr ""
  2592. #. type: Title #
  2593. #: en/./developers/05_Release_new_version.md:83
  2594. #, no-wrap
  2595. msgid "Updating the FreshRSS services"
  2596. msgstr ""
  2597. #. type: Plain text
  2598. #: en/./developers/05_Release_new_version.md:86
  2599. msgid "Two services need to be updated immediately after the update."
  2600. msgstr ""
  2601. #. type: Bullet: '* '
  2602. #: en/./developers/05_Release_new_version.md:89
  2603. msgid "rss.freshrss.org;"
  2604. msgstr ""
  2605. #. type: Bullet: '* '
  2606. #: en/./developers/05_Release_new_version.md:89
  2607. msgid "demo.freshrss.org (public login: `demo` / `demodemo`)."
  2608. msgstr ""
  2609. #. type: Title #
  2610. #: en/./developers/05_Release_new_version.md:90
  2611. #, no-wrap
  2612. msgid "Publicly announce the release"
  2613. msgstr ""
  2614. #. type: Plain text
  2615. #: en/./developers/05_Release_new_version.md:93
  2616. msgid "When everything's working, it's time to announce the release to the world!"
  2617. msgstr ""
  2618. #. type: Bullet: '* '
  2619. #: en/./developers/05_Release_new_version.md:98
  2620. msgid ""
  2621. "on GitHub by creating[a new "
  2622. "release](https://github.com/FreshRSS/FreshRSS/releases/new)"
  2623. msgstr ""
  2624. #. type: Bullet: '* '
  2625. #: en/./developers/05_Release_new_version.md:98
  2626. msgid ""
  2627. "on the freshrss.org blog, at least for stable versions (write the article "
  2628. "on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))"
  2629. msgstr ""
  2630. #. type: Bullet: '* '
  2631. #: en/./developers/05_Release_new_version.md:98
  2632. msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)"
  2633. msgstr ""
  2634. #. type: Bullet: '* '
  2635. #: en/./developers/05_Release_new_version.md:98
  2636. msgid "and on mailing@freshrss.org"
  2637. msgstr ""
  2638. #. type: Title #
  2639. #: en/./developers/05_Release_new_version.md:99
  2640. #, no-wrap
  2641. msgid "Starting the next development version"
  2642. msgstr ""
  2643. #. type: Plain text
  2644. #: en/./developers/05_Release_new_version.md:101
  2645. #, no-wrap
  2646. msgid ""
  2647. "$ git checkout master\n"
  2648. "$ vim constants.php\n"
  2649. "# Update the FRESHRSS_VERSION\n"
  2650. "$ vim CHANGELOG.md\n"
  2651. "# Prepare the changelog for the next version\n"
  2652. "$ git add CHANGELOG.md && git commit && git push\n"
  2653. msgstr ""
  2654. #. type: Plain text
  2655. #: en/./developers/05_Release_new_version.md:110
  2656. msgid ""
  2657. "Also remember to update update.freshrss.org so that it takes the current "
  2658. "development version into account."
  2659. msgstr ""
  2660. #. type: Plain text
  2661. #: en/./index.md:2
  2662. msgid "![FreshRSS logo](img/logo_freshrss.png)"
  2663. msgstr ""
  2664. #. type: Plain text
  2665. #: en/./index.md:4
  2666. msgid ""
  2667. "FreshRSS is an RSS aggregator and reader. It allows you to read and follow "
  2668. "several news websites at a glance without the need to browse from one "
  2669. "website to another."
  2670. msgstr ""
  2671. #. type: Plain text
  2672. #: en/./index.md:6
  2673. msgid "FreshRSS has a lot of features including:"
  2674. msgstr ""
  2675. #. type: Bullet: '* '
  2676. #: en/./index.md:18
  2677. msgid "RSS and Atom aggregation"
  2678. msgstr ""
  2679. #. type: Bullet: '* '
  2680. #: en/./index.md:18
  2681. msgid "Mark article as favorite if you liked it or if you want to read it later"
  2682. msgstr ""
  2683. #. type: Bullet: '* '
  2684. #: en/./index.md:18
  2685. msgid "Filter and search functionality helps to easily find articles"
  2686. msgstr ""
  2687. #. type: Bullet: '* '
  2688. #: en/./index.md:18
  2689. msgid "Statistics to show you the publishing frequency all the websites you follow"
  2690. msgstr ""
  2691. #. type: Bullet: '* '
  2692. #: en/./index.md:18
  2693. msgid "Import/export of your feeds into OPML format"
  2694. msgstr ""
  2695. #. type: Bullet: '* '
  2696. #: en/./index.md:18
  2697. msgid "Several themes created by the community"
  2698. msgstr ""
  2699. #. type: Bullet: '* '
  2700. #: en/./index.md:18
  2701. msgid "\"Google Reader\"-like API to connect Android applications"
  2702. msgstr ""
  2703. #. type: Bullet: '* '
  2704. #: en/./index.md:18
  2705. msgid ""
  2706. "The application is \"responsive,\" which means it adapts to small screens so "
  2707. "you can bring articles in your pocket"
  2708. msgstr ""
  2709. #. type: Bullet: '* '
  2710. #: en/./index.md:18
  2711. msgid ""
  2712. "Self-hosted: the code is free (under AGPL3 licence), so you can host your "
  2713. "own instance of FreshRSS"
  2714. msgstr ""
  2715. #. type: Bullet: '* '
  2716. #: en/./index.md:18
  2717. msgid "Multi-user, so you can also host for your friends and family"
  2718. msgstr ""
  2719. #. type: Bullet: '* '
  2720. #: en/./index.md:18
  2721. msgid "And a lot more!"
  2722. msgstr ""
  2723. #. type: Plain text
  2724. #: en/./index.md:20
  2725. msgid "This documentation is split into different sections:"
  2726. msgstr ""
  2727. #. type: Bullet: '* '
  2728. #: en/./index.md:24
  2729. msgid ""
  2730. "[User documentation](./users/02_First_steps.html), where you can discover "
  2731. "all the possibilities offered by FreshRSS"
  2732. msgstr ""
  2733. #. type: Bullet: '* '
  2734. #: en/./index.md:24
  2735. msgid ""
  2736. "[Administrator documentation](./admins/01_Index.html) for detailed "
  2737. "installation and maintenance related tasks"
  2738. msgstr ""
  2739. #. type: Bullet: '* '
  2740. #: en/./index.md:24
  2741. msgid ""
  2742. "[Developer documentation](./developers/01_First_steps.html) to guide you in "
  2743. "the source code of FreshRSS and to help you if you want to contribute"
  2744. msgstr ""
  2745. #. type: Bullet: '* '
  2746. #: en/./index.md:24
  2747. msgid ""
  2748. "[Contributor guidelines](./contributing.md) for those who want to help "
  2749. "improve FreshRSS"
  2750. msgstr ""
  2751. #. type: Plain text
  2752. #: en/./users/02_First_steps.md:2
  2753. msgid ""
  2754. "Learning how to handle a new application is not always easy. We've tried to "
  2755. "make FreshRSS as intuitive as possible, but you might still need a little "
  2756. "help to master the program."
  2757. msgstr ""
  2758. #. type: Plain text
  2759. #: en/./users/02_First_steps.md:4
  2760. msgid ""
  2761. "This section will guide you to the pages you need to get started. The order "
  2762. "is tailored to newcomers."
  2763. msgstr ""
  2764. #. type: Plain text
  2765. #: en/./users/02_First_steps.md:6
  2766. msgid ""
  2767. "[After installing the application](../admins/03_Installation.md), the first "
  2768. "step is to add some feeds. You have a few options:"
  2769. msgstr ""
  2770. #. type: Bullet: '1. '
  2771. #: en/./users/02_First_steps.md:10
  2772. msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)"
  2773. msgstr ""
  2774. #. type: Bullet: '2. '
  2775. #: en/./users/02_First_steps.md:10
  2776. msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)"
  2777. msgstr ""
  2778. #. type: Bullet: '3. '
  2779. #: en/./users/02_First_steps.md:10
  2780. msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)"
  2781. msgstr ""
  2782. #. type: Plain text
  2783. #: en/./users/02_First_steps.md:12
  2784. msgid ""
  2785. "Once you have added your feeds to FreshRSS, it is time to read them. There "
  2786. "are three availalbe reading modes:"
  2787. msgstr ""
  2788. #. type: Bullet: '1. '
  2789. #: en/./users/02_First_steps.md:16
  2790. msgid ""
  2791. "[The normal view](03_Main_view.md#normal-view) enables you to quickly read "
  2792. "new articles"
  2793. msgstr ""
  2794. #. type: Bullet: '2. '
  2795. #: en/./users/02_First_steps.md:16
  2796. msgid ""
  2797. "[The global view](03_Main_view.md#global-view) shows you an overview of the "
  2798. "status of your feeds in one glance"
  2799. msgstr ""
  2800. #. type: Bullet: '3. '
  2801. #: en/./users/02_First_steps.md:16
  2802. msgid ""
  2803. "[The reader view](03_Main_view.md#reader-view) offers you a comfortable "
  2804. "reading experience"
  2805. msgstr ""
  2806. #. type: Plain text
  2807. #: en/./users/02_First_steps.md:18
  2808. msgid ""
  2809. "Now that you've mastered basic use, it's time to configure FreshRSS to "
  2810. "improve your reading experience. It's highly configurable, so it's "
  2811. "recommended to play around with them to find a configuration that suits you "
  2812. "well. Here are a few resources to help you improve your daily FreshRSS "
  2813. "experience:"
  2814. msgstr ""
  2815. #. type: Bullet: '* '
  2816. #: en/./users/02_First_steps.md:27
  2817. msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)"
  2818. msgstr ""
  2819. #. type: Bullet: '* '
  2820. #: en/./users/02_First_steps.md:27
  2821. msgid "[Change the home page](05_Configuration.md#changing-the-view)"
  2822. msgstr ""
  2823. #. type: Bullet: '* '
  2824. #: en/./users/02_First_steps.md:27
  2825. msgid "[Choose the reading options](05_Configuration.md#reading-options)"
  2826. msgstr ""
  2827. #. type: Bullet: '* '
  2828. #: en/./users/02_First_steps.md:27
  2829. msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)"
  2830. msgstr ""
  2831. #. type: Bullet: '* '
  2832. #: en/./users/02_First_steps.md:27
  2833. msgid ""
  2834. "[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a "
  2835. "selection"
  2836. msgstr ""
  2837. #. type: Bullet: '* '
  2838. #: en/./users/02_First_steps.md:27
  2839. msgid ""
  2840. "[Search an article](03_Main_view.md#searching-articles) published some time "
  2841. "ago"
  2842. msgstr ""
  2843. #. type: Bullet: '* '
  2844. #: en/./users/02_First_steps.md:27
  2845. msgid "[Access your feeds on a mobile device](06_Mobile_access.md)"
  2846. msgstr ""
  2847. #. type: Bullet: '* '
  2848. #: en/./users/02_First_steps.md:27
  2849. msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)"
  2850. msgstr ""
  2851. #. type: Bullet: '* '
  2852. #: en/./users/02_First_steps.md:27
  2853. msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
  2854. msgstr ""
  2855. #. type: Title #
  2856. #: en/./users/03_Main_view.md:1
  2857. #, no-wrap
  2858. msgid "Normal view"
  2859. msgstr ""
  2860. #. type: Title #
  2861. #: en/./users/03_Main_view.md:5
  2862. #, no-wrap
  2863. msgid "Global view"
  2864. msgstr ""
  2865. #. type: Title #
  2866. #: en/./users/03_Main_view.md:9
  2867. #, no-wrap
  2868. msgid "Reader view"
  2869. msgstr ""
  2870. #. type: Title #
  2871. #: en/./users/03_Main_view.md:13
  2872. #, no-wrap
  2873. msgid "Refreshing feeds"
  2874. msgstr ""
  2875. #. type: Plain text
  2876. #: en/./users/03_Main_view.md:16
  2877. msgid ""
  2878. "To take full advantage of FreshRSS, it needs to retrieve new items from the "
  2879. "feeds you have subscribed to. There are several ways to do this."
  2880. msgstr ""
  2881. #. type: Title ##
  2882. #: en/./users/03_Main_view.md:17
  2883. #, no-wrap
  2884. msgid "Automatic update"
  2885. msgstr ""
  2886. #. type: Plain text
  2887. #: en/./users/03_Main_view.md:20
  2888. msgid ""
  2889. "This is the recommended method since you can forget about it once it is "
  2890. "configured."
  2891. msgstr ""
  2892. #. type: Title ###
  2893. #: en/./users/03_Main_view.md:21
  2894. #, no-wrap
  2895. msgid "With the actualize_script.php script"
  2896. msgstr ""
  2897. #. type: Plain text
  2898. #: en/./users/03_Main_view.md:24
  2899. msgid ""
  2900. "This method is only available if you have access to the scheduled tasks of "
  2901. "the machine on which your FreshRSS instance is installed."
  2902. msgstr ""
  2903. #. type: Plain text
  2904. #: en/./users/03_Main_view.md:26
  2905. msgid ""
  2906. "The script is named *actualize_script.php* and is located in the *app* "
  2907. "folder. The scheduled task syntax will not be explained here. However, here "
  2908. "is [a quick introduction to "
  2909. "crontab](http://www.adminschoice.com/crontab-quick-reference/) that might "
  2910. "help you."
  2911. msgstr ""
  2912. #. type: Plain text
  2913. #: en/./users/03_Main_view.md:28
  2914. msgid "Here is an example to trigger article update every hour."
  2915. msgstr ""
  2916. #. type: Code fence info string
  2917. #: 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
  2918. #, no-wrap
  2919. msgid "cron"
  2920. msgstr ""
  2921. #. type: Plain text
  2922. #: en/./users/03_Main_view.md:29
  2923. #, no-wrap
  2924. msgid ""
  2925. "0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log "
  2926. "2>&1\n"
  2927. msgstr ""
  2928. #. type: Plain text
  2929. #: en/./users/03_Main_view.md:34
  2930. msgid "Special parameters to configure the script - all parameters can be combined:"
  2931. msgstr ""
  2932. #. type: Plain text
  2933. #: en/./users/03_Main_view.md:38
  2934. msgid ""
  2935. "- Parameter \"force\" "
  2936. "https://freshrss.example.net/i/?c=feed&a=actualize&force=1 If *force* is set "
  2937. "to 1 all feeds will be refreshed at once."
  2938. msgstr ""
  2939. #. type: Plain text
  2940. #: en/./users/03_Main_view.md:42
  2941. msgid ""
  2942. "- Parameter \"ajax\" "
  2943. "https://freshrss.example.net/i/?c=feed&a=actualize&ajax=1 Only a status site "
  2944. "is returned and not a complete website. Example: \"OK\""
  2945. msgstr ""
  2946. #. type: Plain text
  2947. #: en/./users/03_Main_view.md:46
  2948. msgid ""
  2949. "- Parameter \"maxFeeds\" "
  2950. "https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=30 If *maxFeeds* "
  2951. "is set the configured amount of feeds is refreshed at once. The default "
  2952. "setting is \"10\"."
  2953. msgstr ""
  2954. #. type: Plain text
  2955. #: en/./users/03_Main_view.md:50
  2956. msgid ""
  2957. "- Parameter \"token\" "
  2958. "https://freshrss.example.net/i/?c=feed&a=actualize&token=542345872345734 "
  2959. "Security parameter to prevent unauthorized refreshes. For detailed "
  2960. "Documentation see \"Form authentication\"."
  2961. msgstr ""
  2962. #. type: Title ###
  2963. #: en/./users/03_Main_view.md:51
  2964. #, no-wrap
  2965. msgid "Online cron"
  2966. msgstr ""
  2967. #. type: Plain text
  2968. #: en/./users/03_Main_view.md:54
  2969. msgid ""
  2970. "If you do not have access to the installation server scheduled task, you can "
  2971. "still automate the update process."
  2972. msgstr ""
  2973. #. type: Plain text
  2974. #: en/./users/03_Main_view.md:56
  2975. msgid ""
  2976. "To do so, you need to create a scheduled task, which need to call a specific "
  2977. "URL: https://freshrss.example.net/i/?c=feed&a=actualize (it could be "
  2978. "different depending on your installation). Depending on your application "
  2979. "authentication method, you need to adapt the scheduled task."
  2980. msgstr ""
  2981. #. type: Title ####
  2982. #: en/./users/03_Main_view.md:57
  2983. #, no-wrap
  2984. msgid "No authentication"
  2985. msgstr ""
  2986. #. type: Plain text
  2987. #: en/./users/03_Main_view.md:60
  2988. msgid ""
  2989. "This is the most straightforward since you have a public instance; there is "
  2990. "nothing special to configure:"
  2991. msgstr ""
  2992. #. type: Plain text
  2993. #: en/./users/03_Main_view.md:61
  2994. #, no-wrap
  2995. msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
  2996. msgstr ""
  2997. #. type: Title ###
  2998. #: en/./users/03_Main_view.md:65
  2999. #, no-wrap
  3000. msgid "Form authentication"
  3001. msgstr ""
  3002. #. type: Plain text
  3003. #: en/./users/03_Main_view.md:68
  3004. msgid ""
  3005. "If you configure the application to allow anonymous reading, you can also "
  3006. "allow anonymous users to update feeds (“Allow anonymous refresh of the "
  3007. "articles”)."
  3008. msgstr ""
  3009. #. type: Plain text
  3010. #: en/./users/03_Main_view.md:70
  3011. msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
  3012. msgstr ""
  3013. #. type: Plain text
  3014. #: en/./users/03_Main_view.md:72
  3015. msgid ""
  3016. "The URL used in the previous section will now become accessible to "
  3017. "anyone. Therefore you can use the same syntax for the scheduled task."
  3018. msgstr ""
  3019. #. type: Plain text
  3020. #: en/./users/03_Main_view.md:74
  3021. msgid ""
  3022. "You can also configure an authentication token to grant special access on "
  3023. "the server."
  3024. msgstr ""
  3025. #. type: Plain text
  3026. #: en/./users/03_Main_view.md:76
  3027. msgid "![Token configuration](../img/users/token.1.png)"
  3028. msgstr ""
  3029. #. type: Plain text
  3030. #: en/./users/03_Main_view.md:78
  3031. msgid "The scheduled task syntax should look as follows:"
  3032. msgstr ""
  3033. #. type: Plain text
  3034. #: en/./users/03_Main_view.md:79
  3035. #, no-wrap
  3036. msgid ""
  3037. "0 * * * * curl "
  3038. "'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token'\n"
  3039. msgstr ""
  3040. #. type: Plain text
  3041. #: en/./users/03_Main_view.md:84
  3042. msgid ""
  3043. "You can also target a different user by adding their username to the query "
  3044. "string, with `&user=insert-username`:"
  3045. msgstr ""
  3046. #. type: Plain text
  3047. #: en/./users/03_Main_view.md:85
  3048. #, no-wrap
  3049. msgid ""
  3050. "0 * * * * curl "
  3051. "'https://freshrss.example.net/i/?c=feed&a=actualize&user=someone&token=my-token'\n"
  3052. msgstr ""
  3053. #. type: Title ###
  3054. #: en/./users/03_Main_view.md:89
  3055. #, no-wrap
  3056. msgid "HTTP authentication"
  3057. msgstr ""
  3058. #. type: Plain text
  3059. #: en/./users/03_Main_view.md:92
  3060. msgid ""
  3061. "When using HTTP authentication, the syntax in the two previous sections is "
  3062. "unusable. You'll need to provide your credentials to the scheduled "
  3063. "task. **Note that this method is highly discouraged since it means that your "
  3064. "credentials will be in plain sight!**"
  3065. msgstr ""
  3066. #. type: Plain text
  3067. #: en/./users/03_Main_view.md:93
  3068. #, no-wrap
  3069. msgid ""
  3070. "0 * * * * curl -u alice:password123 "
  3071. "'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
  3072. msgstr ""
  3073. #. type: Title ##
  3074. #: en/./users/03_Main_view.md:97
  3075. #, no-wrap
  3076. msgid "Manual update"
  3077. msgstr ""
  3078. #. type: Plain text
  3079. #: en/./users/03_Main_view.md:100
  3080. msgid ""
  3081. "If you can't or don't want to use the automatic method, you can update "
  3082. "manually. There are two methods for updating all or some of the feeds."
  3083. msgstr ""
  3084. #. type: Title ###
  3085. #: en/./users/03_Main_view.md:101
  3086. #, no-wrap
  3087. msgid "Complete update"
  3088. msgstr ""
  3089. #. type: Plain text
  3090. #: en/./users/03_Main_view.md:104
  3091. msgid ""
  3092. "This update occurs on all feeds. To trigger it, simply click on the update "
  3093. "link in the navigation menu."
  3094. msgstr ""
  3095. #. type: Plain text
  3096. #: en/./users/03_Main_view.md:106
  3097. msgid "![Navigation menu](../img/users/refresh.1.png)"
  3098. msgstr ""
  3099. #. type: Plain text
  3100. #: en/./users/03_Main_view.md:108
  3101. msgid ""
  3102. "When the update starts, a progress bar appears and changes while feeds are "
  3103. "processed."
  3104. msgstr ""
  3105. #. type: Plain text
  3106. #: en/./users/03_Main_view.md:110
  3107. msgid "![Progress bar](../img/users/refresh.5.png)"
  3108. msgstr ""
  3109. #. type: Title ###
  3110. #: en/./users/03_Main_view.md:111
  3111. #, no-wrap
  3112. msgid "Partial update"
  3113. msgstr ""
  3114. #. type: Plain text
  3115. #: en/./users/03_Main_view.md:114
  3116. msgid ""
  3117. "This update occurs on the selected feed only. To trigger it, simply click on "
  3118. "the update link in the feed menu."
  3119. msgstr ""
  3120. #. type: Plain text
  3121. #: en/./users/03_Main_view.md:116
  3122. msgid "![Feed menu](../img/users/refresh.2.png)"
  3123. msgstr ""
  3124. #. type: Title #
  3125. #: en/./users/03_Main_view.md:117
  3126. #, no-wrap
  3127. msgid "Filtering articles"
  3128. msgstr ""
  3129. #. type: Plain text
  3130. #: en/./users/03_Main_view.md:120
  3131. msgid ""
  3132. "When the number of articles stored by FreshRSS inevitably grows larger, it's "
  3133. "important to use efficient filters to display only a subset of the "
  3134. "articles. There are several methods that filter with different "
  3135. "criteria. Usually those methods can be combined."
  3136. msgstr ""
  3137. #. type: Title ##
  3138. #: en/./users/03_Main_view.md:121
  3139. #, no-wrap
  3140. msgid "By category"
  3141. msgstr ""
  3142. #. type: Plain text
  3143. #: en/./users/03_Main_view.md:124
  3144. msgid ""
  3145. "This is the easiest method. You only need to click on the category title in "
  3146. "the side panel. There are two special categories at the top of the panel:"
  3147. msgstr ""
  3148. #. type: Bullet: ' * '
  3149. #: en/./users/03_Main_view.md:127
  3150. msgid ""
  3151. "*Main feed* displays only articles from feeds marked as available in that "
  3152. "category"
  3153. msgstr ""
  3154. #. type: Bullet: ' * '
  3155. #: en/./users/03_Main_view.md:127
  3156. msgid "*Favourites* displays only articles marked as favourites"
  3157. msgstr ""
  3158. #. type: Title ##
  3159. #: en/./users/03_Main_view.md:128
  3160. #, no-wrap
  3161. msgid "By feed"
  3162. msgstr ""
  3163. #. type: Plain text
  3164. #: en/./users/03_Main_view.md:131
  3165. msgid "There are several methods to filter articles by feed:"
  3166. msgstr ""
  3167. #. type: Bullet: ' * '
  3168. #: en/./users/03_Main_view.md:136
  3169. msgid "by clicking the feed title in the side panel"
  3170. msgstr ""
  3171. #. type: Bullet: ' * '
  3172. #: en/./users/03_Main_view.md:136
  3173. msgid "by clicking the feed title in the article details"
  3174. msgstr ""
  3175. #. type: Bullet: ' * '
  3176. #: en/./users/03_Main_view.md:136
  3177. msgid "by filtering in the feed options from the side panel"
  3178. msgstr ""
  3179. #. type: Bullet: ' * '
  3180. #: en/./users/03_Main_view.md:136
  3181. msgid "by filtering in the feed configuration"
  3182. msgstr ""
  3183. #. type: Plain text
  3184. #: en/./users/03_Main_view.md:138
  3185. msgid "![Feed filter](../img/users/feed.filter.1.png)"
  3186. msgstr ""
  3187. #. type: Title ##
  3188. #: en/./users/03_Main_view.md:139
  3189. #, no-wrap
  3190. msgid "By status"
  3191. msgstr ""
  3192. #. type: Plain text
  3193. #: en/./users/03_Main_view.md:142
  3194. msgid ""
  3195. "Each article has two attributes that can be combined. The first attribute "
  3196. "indicates whether or not the article has been read. The second attribute "
  3197. "indicates if the article was marked as favorite or not."
  3198. msgstr ""
  3199. #. type: Plain text
  3200. #: en/./users/03_Main_view.md:144
  3201. msgid ""
  3202. "In version 0.7, attribute filters are available in the article display "
  3203. "dropdown list. With this version, it's not possible to combine filters. For "
  3204. "instance, it's not possible to display only read and favorite articles."
  3205. msgstr ""
  3206. #. type: Plain text
  3207. #: en/./users/03_Main_view.md:146
  3208. msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
  3209. msgstr ""
  3210. #. type: Plain text
  3211. #: en/./users/03_Main_view.md:148
  3212. msgid ""
  3213. "Starting with version 0.8, all attribute filters are visible as toggle "
  3214. "icons. They can be combined. As any combination is possible, some have the "
  3215. "same result. For instance, the result for all filters selected is the same "
  3216. "as no filter selected."
  3217. msgstr ""
  3218. #. type: Plain text
  3219. #: en/./users/03_Main_view.md:150
  3220. msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
  3221. msgstr ""
  3222. #. type: Plain text
  3223. #: en/./users/03_Main_view.md:152
  3224. msgid "By default, this filter displays only unread articles"
  3225. msgstr ""
  3226. #. type: Title ##
  3227. #: en/./users/03_Main_view.md:153
  3228. #, no-wrap
  3229. msgid "By content"
  3230. msgstr ""
  3231. #. type: Plain text
  3232. #: en/./users/03_Main_view.md:156
  3233. msgid ""
  3234. "It is possible to filter articles by their content by inputting a string in "
  3235. "the search field."
  3236. msgstr ""
  3237. #. type: Title ##
  3238. #: en/./users/03_Main_view.md:157
  3239. #, no-wrap
  3240. msgid "With the search field"
  3241. msgstr ""
  3242. #. type: Plain text
  3243. #: en/./users/03_Main_view.md:160
  3244. msgid "You can use the search field to further refine results:"
  3245. msgstr ""
  3246. #. type: Bullet: '* '
  3247. #: en/./users/03_Main_view.md:199
  3248. msgid "by author: `author:name` or `author:'composed name'`"
  3249. msgstr ""
  3250. #. type: Bullet: '* '
  3251. #: en/./users/03_Main_view.md:199
  3252. msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
  3253. msgstr ""
  3254. #. type: Bullet: '* '
  3255. #: en/./users/03_Main_view.md:199
  3256. msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
  3257. msgstr ""
  3258. #. type: Bullet: '* '
  3259. #: en/./users/03_Main_view.md:199
  3260. msgid "by tag: `#tag`"
  3261. msgstr ""
  3262. #. type: Bullet: '* '
  3263. #: en/./users/03_Main_view.md:199
  3264. msgid "by free-text: `keyword` or `'composed keyword'`"
  3265. msgstr ""
  3266. #. type: Plain text
  3267. #: en/./users/03_Main_view.md:199
  3268. #, no-wrap
  3269. msgid ""
  3270. "* by date of discovery, using the [ISO 8601 time interval "
  3271. "format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): "
  3272. "`date:<date-interval>`\n"
  3273. "\t* From a specific day, or month, or year:\n"
  3274. "\t\t* `date:2014-03-30`\n"
  3275. "\t\t* `date:2014-03` or `date:201403`\n"
  3276. "\t\t* `date:2014`\n"
  3277. "\t* From a specific time of a given day:\n"
  3278. "\t\t* `date:2014-05-30T13`\n"
  3279. "\t\t* `date:2014-05-30T13:30`\n"
  3280. "\t* Between two given dates:\n"
  3281. "\t\t* `date:2014-02/2014-04`\n"
  3282. "\t\t* `date:2014-02--2014-04`\n"
  3283. "\t\t* `date:2014-02/04`\n"
  3284. "\t\t* `date:2014-02-03/05`\n"
  3285. "\t\t* `date:2014-02-03T22:00/22:15`\n"
  3286. "\t\t* `date:2014-02-03T22:00/15`\n"
  3287. "\t* After a given date:\n"
  3288. "\t\t* `date:2014-03/`\n"
  3289. "\t* Before a given date:\n"
  3290. "\t\t* `date:/2014-03`\n"
  3291. "\t* For a specific duration after a given date:\n"
  3292. "\t\t* `date:2014-03/P1W`\n"
  3293. "\t* For a specific duration before a given date:\n"
  3294. "\t\t* `date:P1W/2014-05-25T23:59:59`\n"
  3295. "\t* For the past duration before now (the trailing slash is optional):\n"
  3296. "\t\t* `date:P1Y/` or `date:P1Y` (past year)\n"
  3297. "\t\t* `date:P2M/` (past two months)\n"
  3298. "\t\t* `date:P3W/` (past three weeks)\n"
  3299. "\t\t* `date:P4D/` (past four days)\n"
  3300. "\t\t* `date:PT5H/` (past five hours)\n"
  3301. "\t\t* `date:PT30M/` (past thirty minutes)\n"
  3302. "\t\t* `date:PT90S/` (past ninety seconds)\n"
  3303. "\t\t* `date:P1DT1H/` (past one day and one hour)\n"
  3304. "* by date of publication, using the same format: `pubdate:<date-interval>`\n"
  3305. msgstr ""
  3306. #. type: Plain text
  3307. #: en/./users/03_Main_view.md:201
  3308. msgid "Be careful not to enter a space between the operator and the search value."
  3309. msgstr ""
  3310. #. type: Plain text
  3311. #: en/./users/03_Main_view.md:204
  3312. msgid ""
  3313. "Some operators can be used negatively, to exclude articles, with the same "
  3314. "syntax as above, but prefixed by a `!` or `-`: `-author:name`, "
  3315. "`-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
  3316. msgstr ""
  3317. #. type: Plain text
  3318. #: en/./users/03_Main_view.md:206
  3319. msgid ""
  3320. "It is also possible to combine keywords to create a more precise filter. For "
  3321. "example, you can enter multiple instances of `author:`, `intitle:`, "
  3322. "`inurl:`, `#`, and free-text."
  3323. msgstr ""
  3324. #. type: Plain text
  3325. #: en/./users/03_Main_view.md:208
  3326. msgid ""
  3327. "Combining several search criteria implies a logical *and*, but the keyword ` "
  3328. "OR ` can be used to combine several search criteria with a logical *or* "
  3329. "instead: `author:Dupont OR author:Dupond`"
  3330. msgstr ""
  3331. #. type: Title #
  3332. #: en/./users/04_Subscriptions.md:1
  3333. #, no-wrap
  3334. msgid "Adding a feed"
  3335. msgstr ""
  3336. #. type: Title #
  3337. #: en/./users/04_Subscriptions.md:5
  3338. #, no-wrap
  3339. msgid "Import and export"
  3340. msgstr ""
  3341. #. type: Title #
  3342. #: en/./users/04_Subscriptions.md:9
  3343. #, no-wrap
  3344. msgid "Use bookmarklet"
  3345. msgstr ""
  3346. #. type: Plain text
  3347. #: en/./users/04_Subscriptions.md:12
  3348. msgid ""
  3349. "Bookmarklets are little scripts that you can execute to perform various "
  3350. "tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
  3351. msgstr ""
  3352. #. type: Bullet: ' 1. '
  3353. #: en/./users/04_Subscriptions.md:16
  3354. msgid "Open \"Subscriptions management\"."
  3355. msgstr ""
  3356. #. type: Bullet: ' 2. '
  3357. #: en/./users/04_Subscriptions.md:16
  3358. msgid "Click on \"Subscription tools\"."
  3359. msgstr ""
  3360. #. type: Bullet: ' 3. '
  3361. #: en/./users/04_Subscriptions.md:16
  3362. msgid ""
  3363. "Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
  3364. "choose your browser's \"Bookmark link\" action."
  3365. msgstr ""
  3366. #. type: Title #
  3367. #: en/./users/04_Subscriptions.md:17
  3368. #, no-wrap
  3369. msgid "Feed management"
  3370. msgstr ""
  3371. #. type: Title #
  3372. #: en/./users/05_Configuration.md:2
  3373. #, no-wrap
  3374. msgid "Display"
  3375. msgstr ""
  3376. #. type: Title ##
  3377. #: en/./users/05_Configuration.md:4
  3378. #, no-wrap
  3379. msgid "Language"
  3380. msgstr ""
  3381. #. type: Plain text
  3382. #: en/./users/05_Configuration.md:9
  3383. msgid ""
  3384. "FreshRSS is currently available in 14 languages. After confirming your "
  3385. "choice, the interface will be displayed in your preferred language. "
  3386. "Depending on the language chosen, parts of the interface may not be not "
  3387. "translated yet. If you're willing to help translate the missing bits or "
  3388. "would like to add a new language, please take a look at how you can "
  3389. "[contribute to the "
  3390. "project](../contributing.md#contribute-to-internationalization-i18n)."
  3391. msgstr ""
  3392. #. type: Plain text
  3393. #: en/./users/05_Configuration.md:11
  3394. msgid ""
  3395. "Some parts of FreshRSS aren't translated and aren't intended to be "
  3396. "translated either. For now, this includes the logs visible in the "
  3397. "application as well as the log generated by automatic update scripts."
  3398. msgstr ""
  3399. #. type: Plain text
  3400. #: en/./users/05_Configuration.md:13
  3401. msgid ""
  3402. "Available languages are: cz, de, en, es, fr, he, it, kr, nl, oc, pt-br, ru, "
  3403. "tr, zh-cn."
  3404. msgstr ""
  3405. #. type: Title ##
  3406. #: en/./users/05_Configuration.md:14
  3407. #, no-wrap
  3408. msgid "Theme"
  3409. msgstr ""
  3410. #. type: Plain text
  3411. #: en/./users/05_Configuration.md:17
  3412. msgid ""
  3413. "There's no accounting for tastes, which is why FreshRSS offers eight "
  3414. "official themes:"
  3415. msgstr ""
  3416. #. type: Bullet: ' * '
  3417. #: en/./users/05_Configuration.md:26
  3418. msgid "*Blue Lagoon* by **Mister aiR**"
  3419. msgstr ""
  3420. #. type: Bullet: ' * '
  3421. #: en/./users/05_Configuration.md:26
  3422. msgid "*Dark* by **AD**"
  3423. msgstr ""
  3424. #. type: Bullet: ' * '
  3425. #: en/./users/05_Configuration.md:26
  3426. msgid "*Flat design* by **Marien Fressinaud**"
  3427. msgstr ""
  3428. #. type: Bullet: ' * '
  3429. #: en/./users/05_Configuration.md:26
  3430. msgid "*Origine* by **Marien Fressinaud**"
  3431. msgstr ""
  3432. #. type: Bullet: ' * '
  3433. #: en/./users/05_Configuration.md:26
  3434. msgid "*Origine-compact* by **Kevin Papst**"
  3435. msgstr ""
  3436. #. type: Bullet: ' * '
  3437. #: en/./users/05_Configuration.md:26
  3438. msgid "*Pafat* by **Plopoyop**"
  3439. msgstr ""
  3440. #. type: Bullet: ' * '
  3441. #: en/./users/05_Configuration.md:26
  3442. msgid "*Screwdriver* by **Mister aiR**"
  3443. msgstr ""
  3444. #. type: Bullet: ' * '
  3445. #: en/./users/05_Configuration.md:26
  3446. msgid "*Swage* by **Patrick Crandol**"
  3447. msgstr ""
  3448. #. type: Plain text
  3449. #: en/./users/05_Configuration.md:28
  3450. msgid ""
  3451. "If you can't find any themes you like, it's always possible to [create your "
  3452. "own](../developers/04_Frontend/02_Design.md)."
  3453. msgstr ""
  3454. #. type: Plain text
  3455. #: en/./users/05_Configuration.md:30
  3456. msgid ""
  3457. "To select a theme, simply scroll through the themes and select one that "
  3458. "strikes your fancy. After confirmation, the theme will be applied to the "
  3459. "interface."
  3460. msgstr ""
  3461. #. type: Title ##
  3462. #: en/./users/05_Configuration.md:31
  3463. #, no-wrap
  3464. msgid "Content width"
  3465. msgstr ""
  3466. #. type: Plain text
  3467. #: en/./users/05_Configuration.md:34
  3468. msgid ""
  3469. "Some people prefer short lines of text, while others prefer to maximize the "
  3470. "available screen space. To satisfy the maximum number of people, it's "
  3471. "possible to customize the width of the displayed content. There are four "
  3472. "settings available:"
  3473. msgstr ""
  3474. #. type: Bullet: ' * '
  3475. #: en/./users/05_Configuration.md:39
  3476. msgid "**Fine** displays content up to a maximum width of 550 pixels"
  3477. msgstr ""
  3478. #. type: Bullet: ' * '
  3479. #: en/./users/05_Configuration.md:39
  3480. msgid "**Medium** displays content up to a maximum width of 800 pixels"
  3481. msgstr ""
  3482. #. type: Bullet: ' * '
  3483. #: en/./users/05_Configuration.md:39
  3484. msgid "**Large** displays content up to a maximum width of 1000 pixels"
  3485. msgstr ""
  3486. #. type: Bullet: ' * '
  3487. #: en/./users/05_Configuration.md:39
  3488. msgid "**No limit** displays the content on 100% of the available space"
  3489. msgstr ""
  3490. #. type: Title ##
  3491. #: en/./users/05_Configuration.md:40
  3492. #, no-wrap
  3493. msgid "Article icons"
  3494. msgstr ""
  3495. #. type: Plain text
  3496. #: en/./users/05_Configuration.md:43
  3497. msgid "Please note that this section only affects normal view."
  3498. msgstr ""
  3499. #. type: Plain text
  3500. #: en/./users/05_Configuration.md:45
  3501. msgid "![Article icons configuration](../img/users/configuration.article.icons.png)"
  3502. msgstr ""
  3503. #. type: Plain text
  3504. #: en/./users/05_Configuration.md:48
  3505. msgid ""
  3506. "Each article is rendered with a header (top line) and a footer (bottom "
  3507. "line). In that section, you can choose what will be displayed in those."
  3508. msgstr ""
  3509. #. type: Plain text
  3510. #: en/./users/05_Configuration.md:52
  3511. msgid ""
  3512. "If you disable every item in the top line, you'll still be able to see it "
  3513. "since it contains the feed name and the article title. But if you do the "
  3514. "same thing for the bottom line, it will be empty."
  3515. msgstr ""
  3516. #. type: Title ##
  3517. #: en/./users/05_Configuration.md:53
  3518. #, no-wrap
  3519. msgid "HTML5 notification timout"
  3520. msgstr ""
  3521. #. type: Plain text
  3522. #: en/./users/05_Configuration.md:56
  3523. msgid ""
  3524. "After automatically updating the feeds, FreshRSS can pop up a notification "
  3525. "using the HTML5 notification API."
  3526. msgstr ""
  3527. #. type: Plain text
  3528. #: en/./users/05_Configuration.md:58
  3529. msgid "The duration of this notification can be set. By default, the value is 0."
  3530. msgstr ""
  3531. #. type: Title ##
  3532. #: en/./users/05_Configuration.md:59
  3533. #, no-wrap
  3534. msgid "Show the navigation button"
  3535. msgstr ""
  3536. #. type: Plain text
  3537. #: en/./users/05_Configuration.md:62
  3538. msgid ""
  3539. "By default, FreshRSS displays buttons to ease the article navigation when "
  3540. "browsing on mobile. The drawback is that they eat up some precious space."
  3541. msgstr ""
  3542. #. type: Plain text
  3543. #: en/./users/05_Configuration.md:64
  3544. msgid ""
  3545. "![navigation button "
  3546. "configuration](../img/users/configuration.navigation.button.png)"
  3547. msgstr ""
  3548. #. type: Plain text
  3549. #: en/./users/05_Configuration.md:66
  3550. msgid ""
  3551. "If you don't use those buttons because you never browse on mobile or because "
  3552. "you browse with gestures, you can disable them from the interface."
  3553. msgstr ""
  3554. #. type: Title #
  3555. #: en/./users/05_Configuration.md:67
  3556. #, no-wrap
  3557. msgid "Reading"
  3558. msgstr ""
  3559. #. type: Title ##
  3560. #: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154
  3561. #, no-wrap
  3562. msgid "Archival"
  3563. msgstr ""
  3564. #. type: Title #
  3565. #: en/./users/05_Configuration.md:75
  3566. #, no-wrap
  3567. msgid "Sharing"
  3568. msgstr ""
  3569. #. type: Plain text
  3570. #: en/./users/05_Configuration.md:78
  3571. msgid "To make your life easier, you can share articles straight from FreshRSS."
  3572. msgstr ""
  3573. #. type: Plain text
  3574. #: en/./users/05_Configuration.md:80
  3575. msgid ""
  3576. "At the moment, FreshRSS supports 18 sharing methods, ranging from "
  3577. "self-hosted services (Shaarli, etc.) to proprietary services (Facebook, "
  3578. "etc.)."
  3579. msgstr ""
  3580. #. type: Plain text
  3581. #: en/./users/05_Configuration.md:83
  3582. msgid ""
  3583. "By default, the sharing list is empty. ![Sharing "
  3584. "configuration](../img/users/configuration.sharing.png)"
  3585. msgstr ""
  3586. #. type: Plain text
  3587. #: en/./users/05_Configuration.md:85
  3588. msgid "To add a new item to the list, please follow the following simple steps:"
  3589. msgstr ""
  3590. #. type: Bullet: ' 1. '
  3591. #: en/./users/05_Configuration.md:90
  3592. msgid "Select the desired sharing method in the drop-down list."
  3593. msgstr ""
  3594. #. type: Bullet: ' 1. '
  3595. #: en/./users/05_Configuration.md:90
  3596. msgid "Press the ```✚``` button to add it to the list."
  3597. msgstr ""
  3598. #. type: Bullet: ' 1. '
  3599. #: en/./users/05_Configuration.md:90
  3600. msgid ""
  3601. "Configure the method in the list. All names can be modified in the "
  3602. "display. Some methods need the sharing URL to be able to work properly (ex: "
  3603. "Shaarli)."
  3604. msgstr ""
  3605. #. type: Bullet: ' 1. '
  3606. #: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95
  3607. msgid "Submit your changes."
  3608. msgstr ""
  3609. #. type: Plain text
  3610. #: en/./users/05_Configuration.md:92
  3611. msgid "To remove an item from the list, follow those simple steps:"
  3612. msgstr ""
  3613. #. type: Bullet: ' 1. '
  3614. #: en/./users/05_Configuration.md:95
  3615. msgid "Press the ```❌``` button next to the share method you want to remove."
  3616. msgstr ""
  3617. #. type: Title #
  3618. #: en/./users/05_Configuration.md:96
  3619. #, no-wrap
  3620. msgid "Shortcuts"
  3621. msgstr ""
  3622. #. type: Plain text
  3623. #: en/./users/05_Configuration.md:100
  3624. msgid ""
  3625. "To ease the use of the application, FreshRSS comes with a lot of predefined "
  3626. "keyboard shortcuts. They allow actions to improve the user experience with "
  3627. "a keyboard."
  3628. msgstr ""
  3629. #. type: Plain text
  3630. #: en/./users/05_Configuration.md:102
  3631. msgid ""
  3632. "Of course, if you're not satisfied with the key mapping, you can change you "
  3633. "configuration to fit your needs."
  3634. msgstr ""
  3635. #. type: Plain text
  3636. #: en/./users/05_Configuration.md:104
  3637. msgid "There are 4 types of shortcuts:"
  3638. msgstr ""
  3639. #. type: Bullet: ' 1. '
  3640. #: en/./users/05_Configuration.md:109
  3641. msgid "Views: they allow switching views with ease."
  3642. msgstr ""
  3643. #. type: Bullet: ' 1. '
  3644. #: en/./users/05_Configuration.md:109
  3645. msgid "Navigation: they allow navigation through articles, feeds, and categories."
  3646. msgstr ""
  3647. #. type: Bullet: ' 1. '
  3648. #: en/./users/05_Configuration.md:109
  3649. msgid ""
  3650. "Article actions: they allow interactions with an article, like sharing or "
  3651. "opening it on the original web-site."
  3652. msgstr ""
  3653. #. type: Bullet: ' 1. '
  3654. #: en/./users/05_Configuration.md:109
  3655. msgid ""
  3656. "Other actions: they allow other interactions with the application, like "
  3657. "opening the user queries menu or accessing the documentation."
  3658. msgstr ""
  3659. #. type: Plain text
  3660. #: en/./users/05_Configuration.md:112
  3661. msgid ""
  3662. "It's worth noting that the share article action has two levels. Once you "
  3663. "press the shortcut, a menu containing all the share options opens. To "
  3664. "choose one share option, you need to select it by its number. When there is "
  3665. "only one option, it's selected automatically though."
  3666. msgstr ""
  3667. #. type: Plain text
  3668. #: en/./users/05_Configuration.md:114
  3669. msgid "The same process applies to the user queries."
  3670. msgstr ""
  3671. #. type: Plain text
  3672. #: en/./users/05_Configuration.md:117
  3673. msgid ""
  3674. "Be aware that there is no validation on the selected shortcuts. This means "
  3675. "that if you assign a shortcut to more than one action, you'll end up with "
  3676. "some unexpected behavior."
  3677. msgstr ""
  3678. #. type: Title #
  3679. #: en/./users/05_Configuration.md:118
  3680. #, no-wrap
  3681. msgid "User queries"
  3682. msgstr ""
  3683. #. type: Plain text
  3684. #: en/./users/05_Configuration.md:122
  3685. msgid ""
  3686. "You can configure your [user queries](./03_Main_view.md) in that "
  3687. "section. There is not much to say here as it is pretty straightforward. You "
  3688. "can only change user query titles or drop them."
  3689. msgstr ""
  3690. #. type: Plain text
  3691. #: en/./users/05_Configuration.md:124
  3692. msgid "At the moment, there is no helper to build a user query from here."
  3693. msgstr ""
  3694. #. type: Title #
  3695. #: en/./users/05_Configuration.md:125
  3696. #, no-wrap
  3697. msgid "Users"
  3698. msgstr ""
  3699. #. type: Title ##
  3700. #: en/./users/05_Configuration.md:129
  3701. #, no-wrap
  3702. msgid "Authentication methods"
  3703. msgstr ""
  3704. #. type: Title ###
  3705. #: en/./users/05_Configuration.md:131
  3706. #, no-wrap
  3707. msgid "HTTP Authentication (Apache)"
  3708. msgstr ""
  3709. #. type: Bullet: ' 1. '
  3710. #: en/./users/05_Configuration.md:137
  3711. msgid "User control is based on the `.htaccess` file."
  3712. msgstr ""
  3713. #. type: Bullet: ' 2. '
  3714. #: en/./users/05_Configuration.md:137
  3715. msgid ""
  3716. "It is best practice to place the `.htaccess` file in the `./i/` subdirectory "
  3717. "so the API and other third party services can work."
  3718. msgstr ""
  3719. #. type: Bullet: ' 3. '
  3720. #: en/./users/05_Configuration.md:137
  3721. msgid ""
  3722. "If you want to limit all access to registered users only, place the file in "
  3723. "the FreshRSS directory itself or in a parent directory. Note that WebSub and "
  3724. "API will not work!"
  3725. msgstr ""
  3726. #. type: Bullet: ' 4. '
  3727. #: en/./users/05_Configuration.md:137
  3728. msgid "Example `.htaccess` file for a user \"marie\":"
  3729. msgstr ""
  3730. #. type: Plain text
  3731. #: en/./users/05_Configuration.md:138
  3732. #, no-wrap
  3733. msgid ""
  3734. "AuthUserFile /home/marie/repertoire/.htpasswd\n"
  3735. "AuthGroupFile /dev/null\n"
  3736. "AuthName \"Chez Marie\"\n"
  3737. "AuthType Basic\n"
  3738. "Require user marie\n"
  3739. msgstr ""
  3740. #. type: Plain text
  3741. #: en/./users/05_Configuration.md:147
  3742. msgid ""
  3743. "More information can be found in the [Apache "
  3744. "documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)."
  3745. msgstr ""
  3746. #. type: Title #
  3747. #: en/./users/05_Configuration.md:148
  3748. #, no-wrap
  3749. msgid "Subscription management"
  3750. msgstr ""
  3751. #. type: Title ##
  3752. #: en/./users/05_Configuration.md:150
  3753. #, no-wrap
  3754. msgid "Information"
  3755. msgstr ""
  3756. #. type: Title ##
  3757. #: en/./users/05_Configuration.md:158
  3758. #, no-wrap
  3759. msgid "Login"
  3760. msgstr ""
  3761. #. type: Title ##
  3762. #: en/./users/05_Configuration.md:162
  3763. #, no-wrap
  3764. msgid "Advanced"
  3765. msgstr ""
  3766. #. type: Title ###
  3767. #: en/./users/05_Configuration.md:164
  3768. #, no-wrap
  3769. msgid "Retrieve a truncated stream from within FreshRSS"
  3770. msgstr ""
  3771. #. type: Plain text
  3772. #: en/./users/05_Configuration.md:167
  3773. msgid ""
  3774. "This question comes up regularly, so we'll try to clarify how one can "
  3775. "retrieve a truncated RSS feed with FreshRSS. Please note that the process is "
  3776. "absolutely not user friendly, but it works. :)"
  3777. msgstr ""
  3778. #. type: Plain text
  3779. #: en/./users/05_Configuration.md:169
  3780. msgid ""
  3781. "Please be aware that this way you'll generate much more traffic to the "
  3782. "originating sites, and they might block you accordingly. FreshRSS "
  3783. "performance is also negatively affected, because you'll have to fetch the "
  3784. "full article content one by one. So it's a feature to use sparingly!"
  3785. msgstr ""
  3786. #. type: Plain text
  3787. #: en/./users/05_Configuration.md:171
  3788. msgid ""
  3789. "What's meant by \"CSS path of articles on the original site\" actually "
  3790. "corresponds to the \"path\" consisting of IDs and classes (which in HTML, "
  3791. "matches the id and class attributes) to retrieve only the interesting part "
  3792. "that corresponds to the article. Ideally, this path starts with an id (which "
  3793. "is unique to the page)."
  3794. msgstr ""
  3795. #. type: Title ####
  3796. #: en/./users/05_Configuration.md:172
  3797. #, no-wrap
  3798. msgid "Example: Rue89"
  3799. msgstr ""
  3800. #. type: Plain text
  3801. #: en/./users/05_Configuration.md:175
  3802. msgid ""
  3803. "To find this path, you have to go to the address of one of the truncated "
  3804. "articles (for example, "
  3805. "http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-lextase-dihn-pedagogie-inversee-246635). "
  3806. "You look have to look for the \"block\" of HTML that corresponds to article "
  3807. "content (in the source code!)."
  3808. msgstr ""
  3809. #. type: Plain text
  3810. #: en/./users/05_Configuration.md:177
  3811. #, no-wrap
  3812. msgid ""
  3813. "Here we find that the block that encompasses nothing but the content of the "
  3814. "article is ```<div class=\"content clearfix\">```. We'll only use the "
  3815. "`.content` class here. Nevertheless, as said above, it's best to start the "
  3816. "path with an id. If we go back to the parent block, we find ```<div "
  3817. "id=\"article\">``` and that's perfect! The path will be ```#article "
  3818. ".content```.\n"
  3819. msgstr ""
  3820. #. type: Title ####
  3821. #: en/./users/05_Configuration.md:178
  3822. #, no-wrap
  3823. msgid ""
  3824. "Add the corresponding classes to the article CSS path on the feed "
  3825. "configuration page. Examples:"
  3826. msgstr ""
  3827. #. type: Bullet: '* '
  3828. #: en/./users/05_Configuration.md:184
  3829. msgid "Rue89: ```#article .content```"
  3830. msgstr ""
  3831. #. type: Bullet: '* '
  3832. #: en/./users/05_Configuration.md:184
  3833. msgid "PCINpact: ```#actu_content```"
  3834. msgstr ""
  3835. #. type: Bullet: '* '
  3836. #: en/./users/05_Configuration.md:184
  3837. msgid "Lesnumériques: ```article#body div.text.clearfix```"
  3838. msgstr ""
  3839. #. type: Bullet: '* '
  3840. #: en/./users/05_Configuration.md:184
  3841. msgid "Phoronix: ```#main .content```"
  3842. msgstr ""
  3843. #. type: Title ###
  3844. #: en/./users/05_Configuration.md:185
  3845. #, no-wrap
  3846. msgid "Retrieve a truncated stream with external tools"
  3847. msgstr ""
  3848. #. type: Plain text
  3849. #: en/./users/05_Configuration.md:188
  3850. msgid "Complimentary tools can be used to retrieve full article content, such as:"
  3851. msgstr ""
  3852. #. type: Bullet: '* '
  3853. #: en/./users/05_Configuration.md:190
  3854. msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
  3855. msgstr ""
  3856. #. type: Bullet: '* '
  3857. #: en/./users/05_Configuration.md:190
  3858. msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
  3859. msgstr ""
  3860. #. type: Title #
  3861. #: en/./users/06_Fever_API.md:1
  3862. #, no-wrap
  3863. msgid "FreshRSS - Fever API implementation"
  3864. msgstr ""
  3865. #. type: Plain text
  3866. #: en/./users/06_Fever_API.md:5
  3867. msgid ""
  3868. "See the [page about our Google Reader compatible API](06_Mobile_access.md) "
  3869. "for another possibility and general aspects of API access."
  3870. msgstr ""
  3871. #. type: Title ##
  3872. #: en/./users/06_Fever_API.md:6
  3873. #, no-wrap
  3874. msgid "RSS clients"
  3875. msgstr ""
  3876. #. type: Plain text
  3877. #: en/./users/06_Fever_API.md:11
  3878. msgid ""
  3879. "There are many RSS clients that support the Fever API, but they seem to "
  3880. "understand the Fever API a bit differently. If your favourite client "
  3881. "doesn't work properly with this API, please create an issue and we'll have a "
  3882. "look. But we can **only** do that for free clients."
  3883. msgstr ""
  3884. #. type: Title ###
  3885. #: en/./users/06_Fever_API.md:12
  3886. #, no-wrap
  3887. msgid "Usage & Authentication"
  3888. msgstr ""
  3889. #. type: Plain text
  3890. #: en/./users/06_Fever_API.md:16
  3891. msgid ""
  3892. "Before you can start using this API, you have to enable and setup API "
  3893. "access, which is [documented "
  3894. "here](https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html), "
  3895. "and then reset the user’s API password."
  3896. msgstr ""
  3897. #. type: Plain text
  3898. #: en/./users/06_Fever_API.md:18
  3899. msgid ""
  3900. "Then point your mobile application to the `fever.php` address "
  3901. "(e.g. `https://freshrss.example.net/api/fever.php`)."
  3902. msgstr ""
  3903. #. type: Title #
  3904. #: en/./users/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44
  3905. #, no-wrap
  3906. msgid "Compatible clients"
  3907. msgstr ""
  3908. #. type: Plain text
  3909. #: en/./users/06_Fever_API.md:22
  3910. msgid "Tested with:"
  3911. msgstr ""
  3912. #. type: Plain text
  3913. #: en/./users/06_Fever_API.md:25
  3914. #, no-wrap
  3915. msgid ""
  3916. "* Android\n"
  3917. " * "
  3918. "[Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) "
  3919. "(Closed source)\n"
  3920. msgstr ""
  3921. #. type: Plain text
  3922. #: en/./users/06_Fever_API.md:30
  3923. #, no-wrap
  3924. msgid ""
  3925. "* iOS\n"
  3926. " * [Fiery "
  3927. "Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) "
  3928. "(Closed source)\n"
  3929. " * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) "
  3930. "(Commercial)\n"
  3931. " * [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader "
  3932. "API / native FreshRSS option when possible)\n"
  3933. msgstr ""
  3934. #. type: Plain text
  3935. #: en/./users/06_Fever_API.md:33
  3936. #, no-wrap
  3937. msgid ""
  3938. "* MacOS\n"
  3939. " * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
  3940. msgstr ""
  3941. #. type: Title ##
  3942. #: en/./users/06_Fever_API.md:35
  3943. #, no-wrap
  3944. msgid "Features"
  3945. msgstr ""
  3946. #. type: Plain text
  3947. #: en/./users/06_Fever_API.md:38
  3948. msgid "The following features are implemented:"
  3949. msgstr ""
  3950. #. type: Bullet: '* '
  3951. #: en/./users/06_Fever_API.md:48
  3952. msgid "fetching categories"
  3953. msgstr ""
  3954. #. type: Bullet: '* '
  3955. #: en/./users/06_Fever_API.md:48
  3956. msgid "fetching feeds"
  3957. msgstr ""
  3958. #. type: Bullet: '* '
  3959. #: en/./users/06_Fever_API.md:48
  3960. msgid ""
  3961. "fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
  3962. "since)"
  3963. msgstr ""
  3964. #. type: Bullet: '* '
  3965. #: en/./users/06_Fever_API.md:48
  3966. msgid "fetching favicons"
  3967. msgstr ""
  3968. #. type: Bullet: '* '
  3969. #: en/./users/06_Fever_API.md:48
  3970. msgid "setting read marker for item(s)"
  3971. msgstr ""
  3972. #. type: Bullet: '* '
  3973. #: en/./users/06_Fever_API.md:48
  3974. msgid "setting starred marker for item(s)"
  3975. msgstr ""
  3976. #. type: Bullet: '* '
  3977. #: en/./users/06_Fever_API.md:48
  3978. msgid "setting read marker for feed"
  3979. msgstr ""
  3980. #. type: Bullet: '* '
  3981. #: en/./users/06_Fever_API.md:48
  3982. msgid "setting read marker for category"
  3983. msgstr ""
  3984. #. type: Bullet: '* '
  3985. #: en/./users/06_Fever_API.md:48
  3986. msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
  3987. msgstr ""
  3988. #. type: Plain text
  3989. #: en/./users/06_Fever_API.md:50
  3990. msgid "The following features are not supported:"
  3991. msgstr ""
  3992. #. type: Bullet: '* '
  3993. #: en/./users/06_Fever_API.md:52
  3994. msgid ""
  3995. "**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
  3996. "similar or could be used to simulate it."
  3997. msgstr ""
  3998. #. type: Title ##
  3999. #: en/./users/06_Fever_API.md:53
  4000. #, no-wrap
  4001. msgid "Testing and debugging"
  4002. msgstr ""
  4003. #. type: Plain text
  4004. #: en/./users/06_Fever_API.md:56
  4005. msgid ""
  4006. "If this API does not work as expected in your RSS reader, you can test it "
  4007. "manually with a tool like [Postman](https://www.getpostman.com/)."
  4008. msgstr ""
  4009. #. type: Plain text
  4010. #: en/./users/06_Fever_API.md:58
  4011. msgid ""
  4012. "Configure a POST request to the URL "
  4013. "https://freshrss.example.net/api/fever.php?api which should give you the "
  4014. "result:"
  4015. msgstr ""
  4016. #. type: Code fence info string
  4017. #: en/./users/06_Fever_API.md:58 en/./users/06_Fever_API.md:80
  4018. #, no-wrap
  4019. msgid "json"
  4020. msgstr ""
  4021. #. type: Plain text
  4022. #: en/./users/06_Fever_API.md:58
  4023. #, no-wrap
  4024. msgid ""
  4025. "{\n"
  4026. "\t\"api_version\": 3,\n"
  4027. "\t\"auth\": 0\n"
  4028. "}\n"
  4029. msgstr ""
  4030. #. type: Plain text
  4031. #: en/./users/06_Fever_API.md:65
  4032. msgid "Great, the base setup seems to work!"
  4033. msgstr ""
  4034. #. type: Plain text
  4035. #: en/./users/06_Fever_API.md:68
  4036. msgid ""
  4037. "Now lets try an authenticated call. Fever uses an `api_key`, which is the "
  4038. "MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
  4039. "the password `freshrss`, here is a command-line example to compute the "
  4040. "resulting `api_key`"
  4041. msgstr ""
  4042. #. type: Code fence info string
  4043. #: 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
  4044. #, no-wrap
  4045. msgid "sh"
  4046. msgstr ""
  4047. #. type: Plain text
  4048. #: en/./users/06_Fever_API.md:69
  4049. #, no-wrap
  4050. msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
  4051. msgstr ""
  4052. #. type: Plain text
  4053. #: en/./users/06_Fever_API.md:74
  4054. msgid ""
  4055. "Add a body to your POST request encoded as `form-data` and one key named "
  4056. "`api_key` with the value `your-password-hash`:"
  4057. msgstr ""
  4058. #. type: Plain text
  4059. #: en/./users/06_Fever_API.md:75
  4060. #, no-wrap
  4061. msgid ""
  4062. "curl -s -F \"api_key=$api_key\" "
  4063. "'https://freshrss.example.net/api/fever.php?api'\n"
  4064. msgstr ""
  4065. #. type: Plain text
  4066. #: en/./users/06_Fever_API.md:80
  4067. msgid "This should give:"
  4068. msgstr ""
  4069. #. type: Plain text
  4070. #: en/./users/06_Fever_API.md:80
  4071. #, no-wrap
  4072. msgid ""
  4073. "{\n"
  4074. "\t\"api_version\": 3,\n"
  4075. "\t\"auth\": 1,\n"
  4076. "\t\"last_refreshed_on_time\": \"1520013061\"\n"
  4077. "}\n"
  4078. msgstr ""
  4079. #. type: Plain text
  4080. #: en/./users/06_Fever_API.md:88
  4081. msgid ""
  4082. "Perfect, you're now authenticated and you can start testing the more "
  4083. "advanced features. To do so, change the URL and append the possible API "
  4084. "actions to your request parameters. Please refer to the [original Fever "
  4085. "documentation](https://feedafever.com/api) for more information."
  4086. msgstr ""
  4087. #. type: Plain text
  4088. #: en/./users/06_Fever_API.md:90
  4089. msgid "Some basic calls are:"
  4090. msgstr ""
  4091. #. type: Bullet: '* '
  4092. #: en/./users/06_Fever_API.md:100
  4093. msgid "https://freshrss.example.net/api/fever.php?api&items"
  4094. msgstr ""
  4095. #. type: Bullet: '* '
  4096. #: en/./users/06_Fever_API.md:100
  4097. msgid "https://freshrss.example.net/api/fever.php?api&feeds"
  4098. msgstr ""
  4099. #. type: Bullet: '* '
  4100. #: en/./users/06_Fever_API.md:100
  4101. msgid "https://freshrss.example.net/api/fever.php?api&groups"
  4102. msgstr ""
  4103. #. type: Bullet: '* '
  4104. #: en/./users/06_Fever_API.md:100
  4105. msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
  4106. msgstr ""
  4107. #. type: Bullet: '* '
  4108. #: en/./users/06_Fever_API.md:100
  4109. msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
  4110. msgstr ""
  4111. #. type: Bullet: '* '
  4112. #: en/./users/06_Fever_API.md:100
  4113. msgid "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
  4114. msgstr ""
  4115. #. type: Bullet: '* '
  4116. #: en/./users/06_Fever_API.md:100
  4117. msgid "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
  4118. msgstr ""
  4119. #. type: Bullet: '* '
  4120. #: en/./users/06_Fever_API.md:100
  4121. msgid "https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
  4122. msgstr ""
  4123. #. type: Bullet: '* '
  4124. #: en/./users/06_Fever_API.md:100
  4125. msgid "https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
  4126. msgstr ""
  4127. #. type: Plain text
  4128. #: en/./users/06_Fever_API.md:102
  4129. msgid ""
  4130. "Replace `some_id` with a real ID from your `freshrss_username_entry` "
  4131. "database."
  4132. msgstr ""
  4133. #. type: Title ###
  4134. #: en/./users/06_Fever_API.md:103
  4135. #, no-wrap
  4136. msgid "Debugging"
  4137. msgstr ""
  4138. #. type: Plain text
  4139. #: en/./users/06_Fever_API.md:106
  4140. msgid ""
  4141. "If nothing helps and your client is still misbehaving, you can add the "
  4142. "following lines to the beginning of the `fever.api` file to determine the "
  4143. "cause of the problems:"
  4144. msgstr ""
  4145. #. type: Plain text
  4146. #: en/./users/06_Fever_API.md:107
  4147. #, no-wrap
  4148. msgid ""
  4149. "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' "
  4150. ". json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
  4151. msgstr ""
  4152. #. type: Plain text
  4153. #: en/./users/06_Fever_API.md:112
  4154. msgid ""
  4155. "Then use your RSS client to query the API and afterwards check the file "
  4156. "`fever.log`."
  4157. msgstr ""
  4158. #. type: Title ##
  4159. #: en/./users/06_Fever_API.md:113
  4160. #, no-wrap
  4161. msgid "Credits"
  4162. msgstr ""
  4163. #. type: Plain text
  4164. #: en/./users/06_Fever_API.md:115
  4165. msgid ""
  4166. "This plugin was inspired by the "
  4167. "[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)."
  4168. msgstr ""
  4169. #. type: Plain text
  4170. #: en/./users/06_Mobile_access.md:2
  4171. msgid ""
  4172. "This page assumes you have completed the [server "
  4173. "setup](../admins/02_Installation.md)."
  4174. msgstr ""
  4175. #. type: Title #
  4176. #: en/./users/06_Mobile_access.md:3
  4177. #, no-wrap
  4178. msgid "Enable the API in FreshRSS"
  4179. msgstr ""
  4180. #. type: Bullet: '1. '
  4181. #: en/./users/06_Mobile_access.md:9
  4182. msgid ""
  4183. "Under the section “Authentication”, enable the option “Allow API access "
  4184. "(required for mobile apps)”."
  4185. msgstr ""
  4186. #. type: Plain text
  4187. #: en/./users/06_Mobile_access.md:9
  4188. #, no-wrap
  4189. msgid ""
  4190. "2. Under the section “Profile”, fill-in the field “API password (e.g., for "
  4191. "mobile apps)”.\n"
  4192. "\t* Every user must define an API password.\n"
  4193. "\t* The reason for an API-specific password is that it may be used in less "
  4194. "safe situations than the main password, and does not grant access to as many "
  4195. "things.\n"
  4196. msgstr ""
  4197. #. type: Plain text
  4198. #: en/./users/06_Mobile_access.md:12
  4199. msgid ""
  4200. "The rest of this page is about the Google Reader compatible API. See the "
  4201. "[page about the Fever compatible API](06_Fever_API.md) for another "
  4202. "possibility."
  4203. msgstr ""
  4204. #. type: Title #
  4205. #: en/./users/06_Mobile_access.md:14
  4206. #, no-wrap
  4207. msgid "Testing"
  4208. msgstr ""
  4209. #. type: Bullet: '3. '
  4210. #: en/./users/06_Mobile_access.md:21
  4211. msgid ""
  4212. "Under the section “Profile”, click on the link like "
  4213. "`https://rss.example.net/api/` next to the field “API password”."
  4214. msgstr ""
  4215. #. type: Plain text
  4216. #: en/./users/06_Mobile_access.md:21
  4217. #, no-wrap
  4218. msgid ""
  4219. "4. Click on first link “Check full server configuration”:\n"
  4220. "\t* If you get *PASS* then you are done, all is good: you may proceed to "
  4221. "step 6.\n"
  4222. "\t* If you get *Bad Request!* or *Not Found*, then your server probably does "
  4223. "not accept slashes `/` that are escaped `%2F`. Proceed to step 5.\n"
  4224. "\t* If you get any other error message, proceed to step 5.\n"
  4225. msgstr ""
  4226. #. type: Title #
  4227. #: en/./users/06_Mobile_access.md:23
  4228. #, no-wrap
  4229. msgid "Fix server configuration"
  4230. msgstr ""
  4231. #. type: Plain text
  4232. #: en/./users/06_Mobile_access.md:42
  4233. #, no-wrap
  4234. msgid ""
  4235. "5. Click on the second link “Check partial server configuration (without "
  4236. "`%2F` support)”:\n"
  4237. "\t* If you get `PASS`, then the problem is indeed that your server does not "
  4238. "accept slashes `/` that are escaped `%2F`.\n"
  4239. "\t\t* With Apache, remember the directive [`AllowEncodedSlashes "
  4240. "On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
  4241. "\t\t* Or use a client that does not escape slashes (such as EasyRSS), in "
  4242. "which case proceed to step 6.\n"
  4243. "\t* If you get *Service Unavailable!*, then check from step 1 again.\n"
  4244. "\t* With __Apache__:\n"
  4245. "\t\t* If you get *FAIL getallheaders!*, the combination of your PHP version "
  4246. "and your Web server does not provide access to "
  4247. "[`getallheaders`](http://php.net/getallheaders)\n"
  4248. "\t\t\t* Turn on Apache `mod_setenvif` (often enabled by default), or "
  4249. "`mod_rewrite` with the following procedure:\n"
  4250. "\t\t\t\t* Allow [`FileInfo` in "
  4251. "`.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): "
  4252. "see the [server setup](../admins/02_Installation.md) again.\n"
  4253. "\t\t\t\t* Enable "
  4254. "[`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):\n"
  4255. "\t\t\t\t\t* With Debian / Ubuntu: `sudo a2enmod rewrite`\n"
  4256. "\t* With __nginx__:\n"
  4257. "\t\t* If you get *Bad Request!*, check your server `PATH_INFO` "
  4258. "configuration.\n"
  4259. "\t\t* If you get *File not found!*, check your server "
  4260. "`fastcgi_split_path_info`.\n"
  4261. "\t* If you get *FAIL 64-bit or GMP extension!*, then your PHP version does "
  4262. "not pass the requirement of being 64-bit and/or have PHP "
  4263. "[GMP](http://php.net/gmp) extension.\n"
  4264. "\t\t* The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt "
  4265. "install php-gmp`\n"
  4266. "\t* Update and try again from step 3.\n"
  4267. msgstr ""
  4268. #. type: Plain text
  4269. #: en/./users/06_Mobile_access.md:48
  4270. #, no-wrap
  4271. msgid ""
  4272. "6. On the same FreshRSS API page, note the address given under “Your API "
  4273. "address”, like `https://freshrss.example.net/api/greader.php`\n"
  4274. "\t* Type the API address in a client, together with your FreshRSS username, "
  4275. "and the corresponding special API password.\n"
  4276. msgstr ""
  4277. #. type: Plain text
  4278. #: en/./users/06_Mobile_access.md:63
  4279. #, no-wrap
  4280. msgid ""
  4281. "7. Pick a client supporting a Google Reader-like API. Selection:\n"
  4282. "\t* Android\n"
  4283. "\t\t* "
  4284. "[News+](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) "
  4285. "with [News+ Google Reader "
  4286. "extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) "
  4287. "(Closed source)\n"
  4288. "\t\t* [FeedMe "
  4289. "3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) "
  4290. "(Closed source)\n"
  4291. "\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, "
  4292. "[F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
  4293. "\t* Linux\n"
  4294. "\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open "
  4295. "source)\n"
  4296. "\t* MacOS\n"
  4297. "\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Open source)\n"
  4298. "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
  4299. "\t* iOS\n"
  4300. "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
  4301. "\t* Firefox\n"
  4302. "\t\t* "
  4303. "[FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) "
  4304. "(Open source)\n"
  4305. msgstr ""
  4306. #. type: Title #
  4307. #: en/./users/06_Mobile_access.md:65
  4308. #, no-wrap
  4309. msgid "Google Reader compatible API"
  4310. msgstr ""
  4311. #. type: Plain text
  4312. #: en/./users/06_Mobile_access.md:68
  4313. msgid "Examples of basic queries:"
  4314. msgstr ""
  4315. #. type: Plain text
  4316. #: en/./users/06_Mobile_access.md:69
  4317. #, no-wrap
  4318. msgid ""
  4319. "# Initial login, using API password (Email and Passwd can be given either as "
  4320. "GET, or POST - better)\n"
  4321. "curl "
  4322. "'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
  4323. "SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
  4324. "Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
  4325. "\n"
  4326. "# Examples of read-only requests\n"
  4327. "curl -s -H \"Authorization:GoogleLogin "
  4328. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4329. " "
  4330. "'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
  4331. "\n"
  4332. "curl -s -H \"Authorization:GoogleLogin "
  4333. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4334. " "
  4335. "'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
  4336. "\n"
  4337. "curl -s -H \"Authorization:GoogleLogin "
  4338. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4339. " "
  4340. "'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
  4341. "\n"
  4342. "# Retrieve a token for requests making modifications\n"
  4343. "curl -H \"Authorization:GoogleLogin "
  4344. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4345. " 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
  4346. "8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
  4347. "\n"
  4348. "# Get articles, piped to jq for easier JSON reading\n"
  4349. "curl -s -H \"Authorization:GoogleLogin "
  4350. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  4351. " "
  4352. "'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' "
  4353. "| jq .\n"
  4354. msgstr ""
  4355. #. type: Plain text
  4356. #: en/./users/07_Frequently_Asked_Questions.md:2
  4357. msgid ""
  4358. "We may not have answered all of your questions in the previous sections. The "
  4359. "FAQ contains some questions that have not been answered elsewhere."
  4360. msgstr ""
  4361. #. type: Title ##
  4362. #: en/./users/07_Frequently_Asked_Questions.md:3
  4363. #, no-wrap
  4364. msgid "What is `/i` at the end of the application URL?"
  4365. msgstr ""
  4366. #. type: Plain text
  4367. #: en/./users/07_Frequently_Asked_Questions.md:6
  4368. msgid "Of course, ```/i``` has a purpose! It's used for performance and usability:"
  4369. msgstr ""
  4370. #. type: Bullet: '* '
  4371. #: en/./users/07_Frequently_Asked_Questions.md:11
  4372. msgid ""
  4373. "It allows for serving icons, images, styles and scripts without "
  4374. "cookies. Without that trick, those files would be downloaded more often, "
  4375. "especially when form authentication is used. Also, HTTP requests would be "
  4376. "heavier."
  4377. msgstr ""
  4378. #. type: Bullet: '* '
  4379. #: en/./users/07_Frequently_Asked_Questions.md:11
  4380. msgid ""
  4381. "The ```./p/``` public root can be served without any HTTP access "
  4382. "restrictions. Whereas it could be implemented in ```./p/i/```."
  4383. msgstr ""
  4384. #. type: Bullet: '* '
  4385. #: en/./users/07_Frequently_Asked_Questions.md:11
  4386. msgid ""
  4387. "It avoids problems while serving public resources like ```favicon.ico```, "
  4388. "```robots.txt```, etc."
  4389. msgstr ""
  4390. #. type: Bullet: '* '
  4391. #: en/./users/07_Frequently_Asked_Questions.md:11
  4392. msgid ""
  4393. "It allows the logo to be displayed instead of a white page while hitting a "
  4394. "restriction or a delay during the loading process."
  4395. msgstr ""
  4396. #. type: Title ##
  4397. #: en/./users/07_Frequently_Asked_Questions.md:12
  4398. #, no-wrap
  4399. msgid "Why is `robots.txt` located in a sub-folder?"
  4400. msgstr ""
  4401. #. type: Plain text
  4402. #: en/./users/07_Frequently_Asked_Questions.md:15
  4403. msgid ""
  4404. "To increase security, FreshRSS is hosted in two sections. The first section "
  4405. "is public (the `./p` folder) and the second section is private (everything "
  4406. "else). Therefore the `robots.txt` file is located in the `./p` sub-folder."
  4407. msgstr ""
  4408. #. type: Plain text
  4409. #: en/./users/07_Frequently_Asked_Questions.md:17
  4410. msgid ""
  4411. "As explained in the [security "
  4412. "section](/en/User_documentation/Installation/Security), it's highly "
  4413. "recommended to make only the public section available at the domain "
  4414. "level. With that configuration, `./p` is the root folder for "
  4415. "http://demo.freshrss.org/, thus making `robots.txt` available at the root of "
  4416. "the application."
  4417. msgstr ""
  4418. #. type: Plain text
  4419. #: en/./users/07_Frequently_Asked_Questions.md:19
  4420. msgid "The same principle applies to `favicon.ico` and `.htaccess`."
  4421. msgstr ""
  4422. #. type: Title ##
  4423. #: en/./users/07_Frequently_Asked_Questions.md:20
  4424. #, no-wrap
  4425. msgid "Why do I have errors while registering a feed?"
  4426. msgstr ""
  4427. #. type: Plain text
  4428. #: en/./users/07_Frequently_Asked_Questions.md:26
  4429. msgid ""
  4430. "There can be different origins for that problem. The feed syntax can be "
  4431. "invalid, it can be unrecognized by the SimplePie library, the hosting server "
  4432. "can be the root of the problem, or FreshRSS can be buggy. The first step is "
  4433. "to identify what causes the problem. Here are the steps to follow:"
  4434. msgstr ""
  4435. #. type: Bullet: '1. '
  4436. #: en/./users/07_Frequently_Asked_Questions.md:30
  4437. msgid ""
  4438. "__Verify if the feed syntax is valid__ with the [W3C on-line "
  4439. "tool](https://validator.w3.org/feed/ \"RSS and Atom feed validator\"). If "
  4440. "it's not valid, there's nothing we can do."
  4441. msgstr ""
  4442. #. type: Bullet: '1. '
  4443. #: en/./users/07_Frequently_Asked_Questions.md:30
  4444. msgid ""
  4445. "__Verify SimplePie validation__ with the [SimplePie on-line "
  4446. "tool](https://simplepie.org/demo/ \"SimplePie official demo\"). If it's not "
  4447. "recognized, there's nothing we can do."
  4448. msgstr ""
  4449. #. type: Bullet: '1. '
  4450. #: en/./users/07_Frequently_Asked_Questions.md:30
  4451. msgid ""
  4452. "__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org "
  4453. "\"FreshRSS official demo\"). If it's not working, you need to [create an "
  4454. "issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an "
  4455. "issue for FreshRSS\") so we can have a look at it. If it's working, there's "
  4456. "probably something fishy with the hosting server."
  4457. msgstr ""
  4458. #. type: Title ##
  4459. #: en/./users/07_Frequently_Asked_Questions.md:31
  4460. #, no-wrap
  4461. msgid "How can you change a forgotten password?"
  4462. msgstr ""
  4463. #. type: Plain text
  4464. #: en/./users/07_Frequently_Asked_Questions.md:35
  4465. msgid ""
  4466. "Since the [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.10.0) "
  4467. "release, admins can change user passwords directly from the interface. This "
  4468. "interface is available under ```Administration → Manage users```. Select a "
  4469. "user, enter a password, and validate."
  4470. msgstr ""
  4471. #. type: Plain text
  4472. #: en/./users/07_Frequently_Asked_Questions.md:37
  4473. msgid ""
  4474. "Since the [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.8.0) "
  4475. "release, admins can change user passwords using a terminal. It worth "
  4476. "mentioning that you must have access to PHP CLI. Open a terminal, and type "
  4477. "the following command:"
  4478. msgstr ""
  4479. #. type: Plain text
  4480. #: en/./users/07_Frequently_Asked_Questions.md:37
  4481. #, no-wrap
  4482. msgid "./cli/update_user.php --user <username> --password <password>\n"
  4483. msgstr ""
  4484. #. type: Plain text
  4485. #: en/./users/07_Frequently_Asked_Questions.md:41
  4486. msgid ""
  4487. "For more information on that matter, please refer to the [dedicated "
  4488. "documentation](../../cli/README.md)."
  4489. msgstr ""
  4490. #. type: Title ##
  4491. #: en/./users/07_Frequently_Asked_Questions.md:42
  4492. #, no-wrap
  4493. msgid "Permissions under SELinux"
  4494. msgstr ""
  4495. #. type: Plain text
  4496. #: en/./users/07_Frequently_Asked_Questions.md:45
  4497. msgid ""
  4498. "Some Linux distribution, like Fedora or RedHat Enterprise Linux, have "
  4499. "SELinux enabled. This acts similar to a firewall application, so that "
  4500. "applications can't write or modify files under certain conditions. While "
  4501. "installing FreshRSS, step 2 can fail if the httpd process can't write to "
  4502. "some data sub-directories. The following command should be executed as root "
  4503. "to fix this problem:"
  4504. msgstr ""
  4505. #. type: Plain text
  4506. #: en/./users/07_Frequently_Asked_Questions.md:45
  4507. #, no-wrap
  4508. msgid ""
  4509. "semanage fcontext -a -t httpd_sys_rw_content_t "
  4510. "'/usr/share/FreshRSS/data(/.*)?'\n"
  4511. "restorecon -Rv /usr/share/FreshRSS/data\n"
  4512. msgstr ""
  4513. #. type: Title ##
  4514. #: en/./users/07_Frequently_Asked_Questions.md:50
  4515. #, no-wrap
  4516. msgid "Why do I have a blank page while trying to configure the sharing options?"
  4517. msgstr ""
  4518. #. type: Plain text
  4519. #: en/./users/07_Frequently_Asked_Questions.md:53
  4520. msgid ""
  4521. "The `sharing` word in the URL is a trigger word for some ad-blocker "
  4522. "rules. Starting with version 1.16, `sharing` has been replaced by "
  4523. "`integration` in the faulty URL while keeping the exact same wording "
  4524. "throughout the application."
  4525. msgstr ""
  4526. #. type: Plain text
  4527. #: en/./users/07_Frequently_Asked_Questions.md:55
  4528. msgid ""
  4529. "If you are using a version prior to 1.16, you can disable your ad-blocker "
  4530. "for FreshRSS or you can add a rule to allow the `sharing` page to be "
  4531. "accessed."
  4532. msgstr ""
  4533. #. type: Plain text
  4534. #: en/./users/07_Frequently_Asked_Questions.md:57
  4535. msgid "Examples with _uBlock_:"
  4536. msgstr ""
  4537. #. type: Bullet: '- '
  4538. #: en/./users/07_Frequently_Asked_Questions.md:59
  4539. msgid ""
  4540. "Whitelist your FreshRSS instance by adding it in _uBlock > Open the "
  4541. "dashboard > Whitelist_."
  4542. msgstr ""
  4543. #. type: Bullet: '- '
  4544. #: en/./users/07_Frequently_Asked_Questions.md:59
  4545. msgid ""
  4546. "Authorize your FreshRSS instance to call `sharing` configuration page by "
  4547. "adding the rule `*sharing,domain=~yourdomain.com` in _uBlock > Open the "
  4548. "dashboard > My filters_"
  4549. msgstr ""