Error executing template "Designs/Kwpn/ItemPublisher/Details/NewsDetail.cshtml" System.IO.IOException: The process cannot access the file 'D:\inetpub\wwwroot\www.kwpn.nl\Files\Templates\Designs\Kwpn\Translations.xml' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Dynamicweb.Rendering.Translation.Source.WriteDocument(XmlDocument document) at Dynamicweb.Rendering.Translation.Source.Save() at Dynamicweb.Rendering.Translation.Source.UpdateTranslationSource(Source source, IEnumerable`1 newKeys, String designName, IEnumerable`1 cultures) at Dynamicweb.Rendering.Template.TranslateText(String text, String defaultValue, String cultureName) at Dynamicweb.Rendering.TemplateBase`1.Translate(String text, String defaultValue) at CompiledRazorTemplates.Dynamic.RazorEngine_be81d1b98e784d799ef32119dd5c9913.Execute() in D:\inetpub\wwwroot\www.kwpn.nl\Files\Templates\Designs\Kwpn\ItemPublisher\Details\NewsDetail.cshtml:line 203 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @using System.Globalization 2 @using System.Linq 3 @using Kwpn.Models.Constants 4 @using Kwpn.Models.Enumerations 5 @using Kwpn.Repository.Helpers 6 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7 @{ 8 var culture = GetGlobalValue("Global:Area.LongLang"); 9 var cultureInfo = new CultureInfo(GetGlobalValue("Global:Area.LongLang")); 10 var newsParagraphId = GetInteger("ItemPublisher:Global.ParagraphId"); 11 12 // news detail 13 var newsTitle = GetString("ItemPublisher:Item.NewsTitle.Value"); 14 var newsDate = GetDate("ItemPublisher:Item.NewsDate.Value"); 15 var newsDateTime = FormatHelpers.GetDateTime(newsDate, null, cultureInfo, Translate("EventDateDevider", "to")); 16 var newsText = GetString("ItemPublisher:Item.NewsText.Value"); 17 if (!string.IsNullOrEmpty(newsText) && !(newsText.IndexOf("<p>") >= 0 || newsText.IndexOf("<br>") >= 0)) 18 { 19 newsText = newsText.Replace("\n", "<br />"); 20 } 21 22 //image 23 var newsCategories = GetString("ItemPublisher:Item.NewsCategories.Value"); 24 var newsImage = GetString("ItemPublisher:Item.NewsImage.Value"); 25 if (string.IsNullOrWhiteSpace(newsImage) && !string.IsNullOrWhiteSpace(newsCategories)) 26 { 27 newsImage = ImageHelper.GetDefaultImageByCategory(ImageType.NewsCategoryImage, newsCategories.Split(',').FirstOrDefault().Trim()); 28 } 29 30 // extra 31 var noteText = GetString("ItemPublisher:Item.NoteText.Value"); 32 var newsRegion = KwpnNewsHelper.GetNewsRegion(GetString("ItemPublisher:Item.Regions"), culture, noteText); 33 if (!string.IsNullOrWhiteSpace(noteText)) { noteText = string.Format("<div class='note'>{0}</div>", noteText); } 34 var hightlightText = GetString("ItemPublisher:Item.HighlightText.Value"); 35 if (!string.IsNullOrWhiteSpace(hightlightText)) { hightlightText = string.Format("<div class='highlight'>{0}</div>", hightlightText); } 36 var notification = GetString("ItemPublisher:Item.Notification.Value"); 37 38 // linked horsed 39 var linkedHorses = HorseHelper.GetHorsesByAnimalCodes(GetString("ItemPublisher:Item.Horses.Value"), GetGlobalValue("Global:Area.LongLang")); 40 var iLinkedHorseCounter = 0; 41 42 // linked 43 var listOfEventItems = new List<Dynamicweb.Content.Items.Item>(); 44 var kwpnEvents = GetString("ItemPublisher:Item.KwpnEvents.Value"); 45 if (!string.IsNullOrWhiteSpace(kwpnEvents)) 46 { 47 var kwpnEventIdList = kwpnEvents.Split(',').ToList(); 48 foreach (var kwpnEventId in kwpnEventIdList) 49 { 50 var eventItem = Dynamicweb.Content.Items.ItemManager.Storage.GetById(StringConstants.ItemTypes.Event, kwpnEventId); 51 if (eventItem != null) 52 { 53 listOfEventItems.Add(eventItem); 54 } 55 } 56 } 57 58 var showAside = (listOfEventItems.Any() || linkedHorses.Any()); 59 60 var imageMdClass = "col-md-12"; 61 var contentMdClass = "col-md-7 col-md-pull-4"; 62 63 // social media share 64 var openGraphTitle = newsTitle; 65 var openGraphUrl = string.Format("{0}{1}", AreaHelper.GetHost(), System.Web.HttpContext.Current.Request.RawUrl); 66 var openGraphImage = newsImage; 67 var openGraphDefaultImage = string.Format("{0}/Files/Templates/Designs/Kwpn/Images/OpenGraph_NoImg.jpg", AreaHelper.GetHost()); 68 if (string.IsNullOrWhiteSpace(openGraphImage)) 69 { 70 var images = FormatHelpers.GetImagesInHTMLString(GetString("ItemPublisher:Item.NewsText.Value")); 71 var firstImage = ""; 72 if (images.Any()) 73 { 74 firstImage = images.FirstOrDefault(); 75 if (!string.IsNullOrWhiteSpace(firstImage)) 76 { 77 openGraphImage = System.Text.RegularExpressions.Regex.Match(firstImage, "<img.+?src=[\"'](.+?)[\"'].+?>", System.Text.RegularExpressions.RegexOptions.IgnoreCase).Groups[1].Value; 78 79 } 80 } 81 } 82 if (string.IsNullOrWhiteSpace(openGraphImage) || openGraphImage.Length < 10) // root directory left overs negeren: /Files/ 83 { 84 openGraphImage = openGraphDefaultImage; 85 } 86 var openGraphDescription = GetString("ItemPublisher:Item.NewsText.Value").HtmlRemove().ClipLength(100, true); 87 var openGraphLocale = GetGlobalValue("Global:Area.LongLang").Replace("-", "_"); 88 var openGraphSiteName = Translate("OpenGraph_SiteName", "KWPN Royal Dutch Sport Horse"); 89 90 // SEO: seoPage is used as base url for virtual pageviews 91 var seoPage = GetGlobalValue("Global:Pageview.Url"); 92 if (seoPage.Contains("?")) 93 { 94 seoPage = seoPage.Split('?')[0]; 95 } 96 seoPage = string.Format("{0}/{1}/{2}", seoPage, GetString("ItemPublisher:Item.Field.Id"), GetString("ItemPublisher:Item.NewsTitle.Value").Replace(" ", "-").ToLower().UrlEncode()); 97 98 var videoId1 = GetInteger("ItemPublisher:Item.VideoId1.Value"); 99 var videoId2 = GetInteger("ItemPublisher:Item.VideoId2.Value"); 100 var videoId3 = GetInteger("ItemPublisher:Item.VideoId3.Value"); 101 var videoId4 = GetInteger("ItemPublisher:Item.VideoId4.Value"); 102 var hasVideo = videoId1 > 0 || videoId2 > 0 || videoId3 > 0 || videoId4 > 0; 103 104 <div class="break-grid content-container page-content-aside" id="news-detail"> 105 <div class="break-grid-background"> 106 <div class="in-grid news-content"> 107 <div class="row"> 108 <div class="background-head-aside-xs"> 109 <div class="background-head-xs"> 110 <div class="col-xs-12 page-header"> 111 <div class="row"> 112 <div class="col-xs-12 col-md-7"> 113 <div class="row"> 114 @if (!string.IsNullOrWhiteSpace(noteText)) 115 { 116 <div class="col-md-6 hidden-xs hidden-sm">@noteText</div> 117 } 118 @if (!string.IsNullOrWhiteSpace(hightlightText)) 119 { 120 <div class="col-md-6 hidden-xs hidden-sm">@hightlightText</div> 121 } 122 </div> 123 <div class="row"> 124 <div class="col-xs-12"> 125 <h1>@newsTitle</h1> 126 </div> 127 </div> 128 <div class="row"> 129 <div class="col-xs-12"> 130 @if (!string.IsNullOrWhiteSpace(newsDateTime)) 131 { 132 <span class="date"><i class="fa fa-clock-o"></i> @newsDateTime</span> 133 } 134 <div class="visible-xs"></div> 135 @if (!string.IsNullOrWhiteSpace(newsRegion)) 136 { 137 <span class="region"><i class="fa fa-location-arrow"></i> @newsRegion</span> 138 } 139 </div> 140 </div> 141 </div> 142 @if (!string.IsNullOrEmpty(newsImage)) 143 { 144 <div class="col-xs-12 hidden-md hidden-lg"> 145 <div class="news-image"><img src="@newsImage" alt="News image" /></div> 146 </div> 147 } 148 @if (!string.IsNullOrWhiteSpace(noteText)) 149 {<div class="col-xs-12 hidden-md hidden-lg">@noteText</div>} 150 @if (!string.IsNullOrWhiteSpace(hightlightText)) 151 {<div class="col-xs-12 hidden-md hidden-lg">@hightlightText</div>} 152 @if (!string.IsNullOrWhiteSpace(notification)) 153 { 154 <div class="col-xs-12 hidden-md hidden-lg"> 155 <div class="notification"> 156 @notification 157 </div> 158 </div> 159 } 160 </div> 161 </div> 162 </div> 163 <div class="background-aside-xs"> 164 <aside class="col-xs-12 col-md-4 col-md-push-8 news-detail-aside"> 165 166 <!-- /204473129/NieuwsDetail/Banner1 --> 167 <div id='div-gpt-ad-banner1-1' class="google-container google-container--size--b google-container--center google-container--margin-bottom google-container--margin-top-p"> 168 <script> 169 googletag.cmd.push(function () { googletag.display('div-gpt-ad-banner1-1'); }); 170 </script> 171 </div> 172 173 @if (showAside) 174 { 175 <div class="page-aside"> 176 @if (linkedHorses.Any()) 177 { 178 <h2 id="linkedhorses-aside-title" data-childId="linkedhorses-aside-content" class="notactive"><span>@Translate("LinkedHorses", "Linked horses")</span></h2> 179 <div id="linkedhorses-aside-content" class="aside-content notactive"> 180 <div class="linkedHorses"> 181 @foreach (var linkedHorse in linkedHorses) 182 { 183 // modulo for row color display 184 var mod = "0"; 185 if (iLinkedHorseCounter % 2 == 0) 186 { 187 mod = "1"; 188 } 189 190 // gender info 191 var genderClass = "fa-question"; 192 var genderAbbr = ""; 193 var gender = Kwpn.Models.Enumerations.Gender.UNKNOWN; 194 Enum.TryParse(linkedHorse.Gender.ToUpper(), out gender); 195 switch (gender) 196 { 197 case Kwpn.Models.Enumerations.Gender.HENGST: 198 genderClass = "fa-mars"; 199 genderAbbr = Translate("Stallion", "Stallion"); 200 break; 201 case Kwpn.Models.Enumerations.Gender.MERRIE: 202 genderClass = "fa-venus"; 203 genderAbbr = Translate("Mare", "Mare"); 204 break; 205 case Kwpn.Models.Enumerations.Gender.RUIN: 206 genderClass = "fa-mars"; //fa-mars-stroke-h 207 genderAbbr = Translate("Gelding", "Gelding"); 208 break; 209 } 210 211 // horse info 212 var horseName = HorseHelper.GetHorseName(linkedHorse.SportsName, linkedHorse.AnimalName, linkedHorse.DateOfBirth); 213 214 // father info 215 var fatherName = ""; 216 var father = linkedHorse.GetPredigreeByPrefix(Kwpn.Models.Constants.StringConstants.PedigreePrefixes.Father); 217 if (father != null) 218 { 219 fatherName = father.AnimalName; 220 } 221 else 222 { 223 fatherName = Translate("Unknown", "Unknown"); 224 } 225 var fatherNameAbbr = Translate("FathersName", "Fathers name").JsEncode(); 226 227 // mothers father info 228 var mothersFatherName = ""; 229 var mothersFather = linkedHorse.GetPredigreeByPrefix(Kwpn.Models.Constants.StringConstants.PedigreePrefixes.MothersFather); 230 if (mothersFather != null) 231 { 232 mothersFatherName = mothersFather.AnimalName; 233 } 234 else 235 { 236 mothersFatherName = Translate("Unknown", "Unknown"); 237 } 238 var mothersFatherNameAbbr = Translate("MothersFathersName", "Mothers fathers name").JsEncode(); 239 var databaseLink = HorseHelper.GetHorseInfoPageUrl(GetGlobalValue("Global:Area.LongLang"), linkedHorse.AnimalCode); 240 <a href="@databaseLink"> 241 <div class="row mod-@mod"> 242 <div class="col-xs-2"> 243 <span class="gender"><i class="fa @genderClass" title='@genderAbbr.JsEncode()'></i></span> 244 </div> 245 <div class="col-xs-10"> 246 <span class="name">@horseName</span> 247 <span class="parents"> 248 <abbr title='@fatherNameAbbr'>@fatherName</abbr> x <abbr title='@mothersFatherNameAbbr'>@mothersFatherName</abbr> 249 </span> 250 </div> 251 </div> 252 </a> 253 iLinkedHorseCounter++; 254 } 255 </div> 256 </div> 257 } 258 @if (listOfEventItems.Any()) 259 { 260 var kwpnEventCounter = 0; 261 var eventPageId = AreaHelper.GetAreaItemStringValueBySystemName(StringConstants.PageIdSystemNames.EventPageId); 262 263 if (!string.IsNullOrWhiteSpace(eventPageId)) 264 { 265 <h2 id="linkedevents-aside-title" data-childId="linkedevents-aside-content" class="notactive"><span>@Translate("LinkedEvents", "Linked events")</span></h2> 266 <div id="linkedevents-aside-content" class="aside-content notactive"> 267 <div class="linkedEvents"> 268 @foreach (var kwpnEvent in listOfEventItems) 269 { 270 // modulo for row color display 271 var mod = "0"; 272 if (kwpnEventCounter % 2 == 0) 273 { 274 mod = "1"; 275 } 276 var kwpnEventId = ItemHelper.GetItemValue<int>(kwpnEvent, StringConstants.ItemTypes.Event_Id); 277 var kwpnEventTitle = ItemHelper.GetItemValue<string>(kwpnEvent, StringConstants.ItemTypes.Event_Title); 278 var dateFrom = ItemHelper.GetItemValue<DateTime>(kwpnEvent, StringConstants.ItemTypes.Event_FromDate); 279 var dateTo = ItemHelper.GetItemValue<DateTime>(kwpnEvent, StringConstants.ItemTypes.Event_ToDate); 280 var eventDateTime = FormatHelpers.GetDateTime(dateFrom, dateTo, cultureInfo, Translate("EventDateDevider", "to")); 281 var kwpnEventLink = string.Format("/Default.aspx?ID={0}&itemId={1}:{2}", eventPageId, StringConstants.ItemTypes.Event, kwpnEventId); 282 var customPageLink = ItemHelper.GetItemValue<string>(kwpnEvent, StringConstants.ItemTypes.Event_CustomEventPage); 283 if (!string.IsNullOrEmpty(customPageLink)) 284 { 285 kwpnEventLink = customPageLink; 286 } 287 <a href="@kwpnEventLink"> 288 <div class="row mod-@mod"> 289 <div class="col-xs-2"> 290 <span class="clock"><i class="fa fa-clock-o"></i></span> 291 </div> 292 <div class="col-xs-10"> 293 <span class="date-time">@eventDateTime</span> 294 <span class="title">@kwpnEventTitle</span> 295 </div> 296 </div> 297 </a> 298 kwpnEventCounter++; 299 } 300 </div> 301 </div> 302 } 303 } 304 </div> 305 } 306 307 308 309 </aside> 310 </div> 311 </div> 312 313 <article class="col-xs-12 @contentMdClass page-content news-detail-output"> 314 @if (!string.IsNullOrWhiteSpace(notification)) 315 { 316 <div class="row"> 317 <div class="hidden-xs hidden-sm col-md-12"> 318 <div class="notification"> 319 @notification 320 </div> 321 </div> 322 </div> 323 } 324 325 @*IMAGE FOR LARGE VIEW*@ 326 @if (!string.IsNullOrEmpty(newsImage)) 327 { 328 // KWPN-1733 Use image handler because content managers upload huge images from the content section of the CMS, which causes them not to be scaled immediately on upload 329 newsImage = $"/Admin/Public/GetImage.ashx?Image={newsImage}&Crop={(int)Kwpn.Models.Enumerations.ImageCrop.KeepAspectRatio}&Format=jpg&Width=800&Height=600&Compression=75&fillcanvas=false"; 330 <div class="row hidden-xs hidden-sm"> 331 <div class="@imageMdClass"> 332 <div class="news-image" style="background-image: url('@newsImage');"> 333 </div> 334 </div> 335 </div> 336 } 337 338 @if (!string.IsNullOrWhiteSpace(newsText)) 339 { 340 <div class="row"> 341 <div class="col-xs-12 news-par"> 342 @newsText 343 </div> 344 </div> 345 } 346 @if (hasVideo) 347 { 348 <div class="row kwpntv"> 349 <div class="col-xs-12 kwpntv--category-topx"> 350 <div class="result-container kwpntv-news-video-results" id="kwpntv-news-video-results-@newsParagraphId"></div> 351 </div> 352 </div> 353 @SnippetStart("JavascriptsBottom") 354 <script id="news-video-template-@newsParagraphId" type="text/html"> 355 {{if EmbedURL}} 356 <div class="col-xs-12 col-md-6"> 357 <a href="${EmbedURL}" target="_blank"> 358 <div class="embed-responsive embed-responsive-16by9"> 359 <img src="${Thumb}" /> 360 </div> 361 <div class="embed-title"> 362 {{if Title}} 363 <h3>${Title}</h3> 364 {{/if}} 365 </div> 366 {{if Duration}} 367 <div class="duration">${VideoHelper.ConvertDuraton(Duration)}</div> 368 {{/if}} 369 </a> 370 </div> 371 {{/if}} 372 </script> 373 <script> 374 $(document).ready(function () { 375 var videoContainer = $("#kwpntv-news-video-results-@newsParagraphId"); 376 videoContainer.html(""); // remove spinner 377 @for (int i = 1; i < 5; i++) 378 { 379 var videoId = GetInteger($"ItemPublisher:Item.VideoId{i}.Value"); 380 if (videoId > 0) { 381 <text> 382 var getVideoUrl = "/kwpnwebapi/videos/getvideobyid/@culture/@videoId"; 383 $.getJSON(getVideoUrl).done(function(video) { 384 if (video != null) 385 { 386 $("#news-video-template-@newsParagraphId").tmpl(video).appendTo(videoContainer); 387 } 388 }).fail(function(jqxhr, textStatus, error) { 389 var err = textStatus + ", " + error; 390 console.error("Request get video by id failed: " + err); 391 }); 392 </text> 393 } 394 } 395 }); 396 </script> 397 @SnippetEnd("JavascriptsBottom") 398 } 399 </article> 400 </div> 401 </div> 402 </div> 403 @{ 404 var carouselId = $"related-news-{newsParagraphId}"; 405 var carouselInterval = "false"; // false or set interval in ms 406 var carouselPeakNext = false; 407 var carouselResponsiveness = carouselPeakNext ? "col-xs-11 col-md-10 " : "col-xs-12 col-centered"; 408 } 409 <div id="related-news-wrapper" class="hidden"> 410 <div class="in-grid news-content"> 411 <div class="row"> 412 <div class="col-xs-12"><h3>@Translate("RelatedNews", "Related news")</h3></div> 413 </div> 414 </div> 415 <div class="break-grid-extra"> 416 <div class="row"> 417 <div class="@carouselResponsiveness"> 418 <div id="@carouselId" class="carousel carousel-multi slide" data-ride="carousel" data-type="multi" data-interval="@carouselInterval"> 419 <div class="carousel-inner" id="horses-for-sale-results-@newsParagraphId"> 420 <!-- filled by javascript --> 421 </div> 422 <!-- Controls --> 423 <div class="left carousel-control"> 424 <a href="#@carouselId" role="button" data-slide="prev"> 425 <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> 426 <span class="sr-only">Previous</span> 427 </a> 428 </div> 429 <div class="right carousel-control"> 430 <a href="#@carouselId" role="button" data-slide="next"> 431 <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> 432 <span class="sr-only">Next</span> 433 </a> 434 </div> 435 </div> 436 </div> 437 </div> 438 </div> 439 </div> 440 441 <div class="break-grid-background"> 442 <div class="in-grid news-content"> 443 <div class="row"> 444 <div class="col-xs-12 col-md-6"> 445 <a href="javascript:history.back();" class="backlink"><i class="fa fa-chevron-left"></i>@Translate("BackToOverview", "Back to overview")</a> 446 </div> 447 <div class="col-xs-12 col-md-6"> 448 <div class="socialmediashare pull-right"> 449 <!-- AddToAny BEGIN --> 450 <div class="a2a_kit a2a_kit_size_32 a2a_default_style"> 451 <a class="a2a_dd" href="https://www.addtoany.com/share"></a> 452 <a class="a2a_button_facebook"></a> 453 <a class="a2a_button_twitter"></a> 454 <a class="a2a_button_google_plus"></a> 455 </div> 456 <script async src="https://static.addtoany.com/menu/page.js"></script> 457 <!-- AddToAny END --> 458 </div> 459 </div> 460 </div> 461 </div> 462 </div> 463 </div> 464 465 @SnippetStart("HeaderContent") 466 <meta property="og:title" content="@openGraphTitle" /> 467 <meta property="og:type" content="article" /> 468 <meta property="og:url" content="@openGraphUrl" /> 469 <meta property="og:image" content="@openGraphImage" /> 470 <meta property="og:description" content="@openGraphDescription" /> 471 <meta property="og:locale" content="@openGraphLocale" /> 472 <meta property="og:site_name" content="@openGraphSiteName" /> 473 <meta property="fb:app_id" content="234190117053664" /> 474 <script> 475 SEO.trackPageView("@seoPage"); 476 </script> 477 @SnippetEnd("HeaderContent") 478 479 @SnippetStart("JavascriptsBottom") 480 <script id="related-news-item" type="text/html"> 481 <div class="item"> 482 <div class="carousel-col"> 483 <div class="block clickable" data-url="/Default.aspx?ID=@GetString("ItemPublisher:Global.PageId")&itemId=@Kwpn.Models.Constants.StringConstants.ItemTypes.News:${id}"> 484 <div class="image" style="background-image:url('${image}')"> 485 <div class="date"><i class="fa fa-clock-o"></i> ${MarketplaceHelper.GetSinceDate(newsDate, "@Dynamicweb.Frontend.PageView.Current().Area.Culture.ToLower()")}</div> 486 </div> 487 <div class="bottom"> 488 <div class="text"> 489 <div class="truncate-overflow">${title}</div> 490 </div> 491 </div> 492 </div> 493 </div> 494 </div> 495 </script> 496 <script> 497 $(document).ready(function () { 498 // get related news 499 NewsHelper.GetRelatedNews('@culture', '@GetString("ItemPublisher:Item.Id.Value")', 6, 'related-news-wrapper', '@carouselId', 'horses-for-sale-results-@newsParagraphId', 'related-news-item'); 500 }); 501 </script> 502 @SnippetEnd("JavascriptsBottom") 503 } 504
The KWPN (Studbook of the Royal Dutch Sport Horse) is a Netherlands-based organization specializing in the breeding of jumpers, dressage horses, harness horses, and Gelder horses.
More info